들어가기 전에
이번 시간엔 데이터가 저장되는 틀인 테이블을 생성, 수정, 삭제하는 방법에 대해 배워보도록 하겠습니다.
학습 목표
- 테이블을 생성할 수 있다.
- 테이블을 수정할 수 있다.
- 테이블을 삭제할 수 있다.
핵심 개념
- create table
- alter table
- drop table
학습하기
들어가기 전에
이번 시간엔 데이터가 저장되는 틀인 테이블을 생성, 수정, 삭제하는 방법에 대해 배워보도록 하겠습니다.
학습 목표
핵심 개념
학습하기
MySQL 데이터 타입
테이블 생성
create table 테이블명(
필드명1 타입 [NULL | NOT NULL][DEFAULT ][AUTO_INCREMENT],
필드명2 타입 [NULL | NOT NULL][DEFAULT ][AUTO_INCREMENT],
필드명3 타입 [NULL | NOT NULL][DEFAULT ][AUTO_INCREMENT],
...........
PRIMARY KEY(필드명)
);
테이블 생성 실습
EMPLOYEE와 같은 구조를 가진 EMPLOYEE2 테이블을 생성하시오.
CREATE TABLE EMPLOYEE2(
empno INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
job VARCHAR(9),
boss INTEGER,
hiredate VARCHAR(12),
salary DECIMAL(7, 2),
comm DECIMAL(7, 2),
deptno INTEGER);
테이블 수정 (컬럼 추가 / 삭제)
alter table 테이블명
add 필드명 타입 [NULL | NOT NULL][DEFAULT ][AUTO_INCREMENT];
alter table 테이블명
drop 필드명;
테이블 수정 실습 (컬럼 추가)
실습 – EMPLOYEE2 테이블에 생일(birthdate)칼럼을 varchar(12)형식으로 추가하시오.
alter table EMPLOYEE2
add birthdate varchar(12);
테이블 수정 실습 (컬럼 삭제)
실습 – EMPLOYEE2 테이블의 생일(birthdate)칼럼을 삭제하시오.
alter table EMPLOYEE2
drop birthdate;
테이블 수정 (컬럼 수정)
alter table 테이블명
change 필드명 새필드명 타입 [NULL | NOT NULL][DEFAULT ][AUTO_INCREMENT];
테이블 수정 실습 (컬럼 수정)
실습 – EMPLOYEE2 테이블의 부서번호(deptno)를 dept_no로 수정하시오.
alter table EMPLOYEE2
change deptno dept_no int(11);
테이블 이름 변경
alter table 테이블명 rename 변경이름
테이블 이름 변경 실습
실습 – EMPLOYEE2 테이블의 이름을 EMPLOYEE3로 변경하시오.
alter table EMPLOYEE2
rename EMPLOYEE3;
테이블 삭제하기
drop table 테이블이름;
참고로, 제약 조건이 있을 경우에는 drop table 명령으로도 테이블이 삭제되지 않을 수 있습니다.
그럴 경우는 테이블을 생성한 반대 순서로 삭제를 해야합니다.
테이블 삭제 실습
* 테이블 삭제 후 desc 명령을 수행하면, 존재하지 않는 테이블이라고 표시됩니다.
실습 – EMPLOYEE2 테이블을 삭제하시오.
drop table EMPLOYEE2;
생각해보기
참고 자료
https://dev.mysql.com
https://dev.mysql.com
https://dev.mysql.com
comment
24.04.05.
220303
1. 오류가 발생하거나 길이에 맞게 5글자만 남기고 잘릴 것 같음.
-> 실제 수행결과 ERROR 1265 (01000): Data truncated for column '컬럼명' at row 5 오류뜸
2. char는 고정형 데이터 타입이고 varchar는 가변형 데이터 타입이다. 칼럼의 데이터 타입을 char(10)으로 설정하면 실제로 5만큼쓰든 7만큼쓰든 10만큼 쓰든 상관없이 10byte만큼의 공간을 고정적으로 할당한다. 반면 varchar는 10byte로 설정했더라도 실제 데이터의 길이가 10을 넘어가거나 10에 못미치면 그에 맞게 저절로 공간이 늘었다 줄었다 한다. 그러면 무조건 varchar가 좋은거 아니냐? 할 수 있는데 수행속도에서 차이가 난다. 연산을 따로 안하기 때문에 char가 varchar보다 더 빠르다. 대신 용량은 char가 varchar보다 더 차지할 것이다. 이거 깊이 들어가면 시간복잡도 공간복잡도 얘기도 나오는데 나는 아직 응애라서 거기까진 잘 모르겠다. 아무튼 용량을 희생하는 대신 속도를 빠르게 할거냐 vs 속도를 희생하는 대신 용량을 덜 차지하게 할거냐의 문제로 용량과 속도는 반비례 관계에 있으며 char나 varchar나 일장일단이 있는 것 같다. 그래서 주민등록번호나 전화번호처럼 형식이 정해져있는 데이터는 char를 이용하는 것이 좋다.
3. 찾아보기 귀찮음. 근데 이건 게임 캐릭터 닉네임 지을 때를 생각해보면 대충 유추할 수 있는데 보통 게임 캐릭터 닉네임은 한글 6글자, 영문 12자까지 가능하다. 영문으로 썼을 때 한글보다 2배 더 길게 쓸 수 있는 것이다. 왜 이런 차이가 생기느냐 하면 한글은 한 글자당 2byte를 먹고, 알파벳은 한 글자당 1byte를 먹기 때문이다.
1. 데이터가 없다면 수정이 가능하나 데이터가 있다면 칼럼의 길이를 더 짧게 줄일 때 "ERROR 1265 (01000): Data truncated for column 'name' at row 1"라는 에러가 발생한다.
2. 데이터 저장에서의 차이 - varchar가 유리하다, 비교방법에서의 차이 - varchar가 유리하다, 속도 측면의 차이 - char가 유리하다. 가변길이 데이터(이름, 가격 등)를 사용할 때는 varchar, 고정길이 데이터(사번, 부서번호 등)를 사용할 때는 char를 사용하는 것이 유리하다.
> 참고 링크 https://goodgid.github.io/JS-char-vs-varchar/
> 참고 링크 https://www.geeksforgeeks.org/char-vs-varchar-in-sql/
3. ASCII코드는 1또는 2바이트이므로 예시에선 10~20바이트 차지, UTF-8은 1 또는 3바이트 이므로 10~30바이트 차지한다.
21.05.14
여기 관리하시는 분은 이걸 좀 고려했으면 하네요. 기본적으로 SQL 섹터의 2번과 3번 즉 DDL과 DTL 순서가 바뀌는게 맞지 않을까요? DB를 생성하고 테이블 생성하고 그러고 나서 데이터 삽입 수정 삭제 조회를 하는게 맞지 않을까요? 그러려면 2번 3번이 바뀌어야 하겠죠
< 생각해보기 >
1. 칼럼의 길이가 10인데, 해당 칼럼에 값이 저장되어 있습니다. 이 때 칼럼의 길이를 5로 바꾼다면 어떤 일이 벌어질까요?
>>>
mysql> alter table employee2 change job job varchar(5);
ERROR 1265 (01000): Data truncated for column 'job' at row 1
위와 같은 에러가 발생하고 실행되지 않는다.
2. 문자열을 저장하는 데이터 타입인 CHAR와 VARCHAR 차이점에 대해 알아보고 어떤 상황에서 CHAR 또는 VARCHAR 를 선택하는 것이 효율적인지 생각해봅시다.
>>>
CHAR는 고정 길이, 문자열이 가변적이라면 비효율적이다.
VARCHAR는 가변 길이 (오라클에선 varchar2로, sql server는 varchar로 표기), 할당된 변수값의 바이트만 적용이 된다.
Varchar는 길이를 계산해야 하기 때문에 미세하게 느릴 수 있지만, 속도 차이가 거의 없다. 또한 프로젝트는 언제든 변할 수 있고, 고정 공간을 만드므로 빈 공간에 대한 비용이 더 큰 경우가 있으므로 varchar를 사용하는 것이 더 낫다.
(참고 사이트 : https://mozi.tistory.com/229)
3.문자열 데이터 타입에는 문자셋을 지정할 수 있습니다. 문자셋에 따라 해당 필드가 차지하는 공간 크기를 한번 계산해보자. (예: VARCHAR(10) CHARACTER SET UTF8; 은 몇 Byte 크기를 차지할까요? ASCII 일때는 또 몇 Byte 크기를 가질까요?
>>>
[ euc-kr ] ascii 코드 + 한글
영문/숫자/기호는 1바이트. 한글과 한자는 2바이트
[ utf-8 ]
영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현
(참고 사이트 : http://www.rcy.co.kr/xeb/study/2900)
char와 varchar의 가장 큰 차이점은 고정형과 가변형입니다.
char의 경우 크기가 한번 정해지면 비록 문자를 적게쓰더라도 계속 크기가 정해진대로 유지되지만
varchar의 경우 한번정해진 크기보다 작을경우 작은 만큼의 크기로 유지되기 때문입니다.
따라서 데이터가 일정한 정해진 크기라면 char 타입(ex. lsbn)을 쓰는것이 좋고 아이디같은 것이면 varchar가 유용해 보입니다.
감사합니다.
1. 오류가 발생하면서 해당 쿼리는 취소된다.
2. char는 어떤 문자열이 들어와도 지정한 크기만큼 메모리가 할당된다. (c에서 배열과 비슷) varchar는 들어온 문자열의 길이를 계산해 그 크기만큼 메모리가 할당된다. (java에서 arraylist와 비슷) char는 길이 연산을 할 필요가 없는 항상 일정한 길이의 문자열을 처리할 때 즉, 길이를 구하는 연산을 안해도 되는 문자열을 처리할 때 좋고 varchar는 길이가 다양한 문자열을 받을 때 즉, 길이를 구하는 연산은 하지만 메모리 공간을 덜 차지 하게 할 수 있을 때 좋다.
3. utf-8은 mysql에서 최대 3byte 이므로 총 30byte를 차지하고 ASCII는 1byte이므로 총 10byte를 차지한다.
틀린 거 지적해주시면 감사하겠습니다~
좋은 강의 감사합니다. 영상 4분부터 화면이 반짝거립니다.