들어가기 전에
이번 시간엔 데이터가 저장되는 틀인 테이블을 생성, 수정, 삭제하는 방법에 대해 배워보도록 하겠습니다.
학습 목표
- 테이블을 생성할 수 있다.
- 테이블을 수정할 수 있다.
- 테이블을 삭제할 수 있다.
핵심 개념
- 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
1. 데이터가 잘리기 때문에 "ERROR 1265 (01000): Data truncated for column 'name' at row 1"와 같은 에러가 발생하고 해당 명령은 실행되지 않습니다.
2. CHAR 데이터 타입은 길이가 고정되기 때문에 저장 및 검색이 빠르지만 저장공간을 낭비할 수 있고, VARCHAR 데이터 타입은 길이가 가변적이기 때문에 저장 및 검색이 느리지만 저장공간을 낭비하지 않습니다.
CHAR 데이터 타입은 고정된 데이터인 성별, 주민번호 등을 저장 및 연산할 때 쓰이면 좋고, VARCHAR은 가변적인 데이터인 Content, Address 등을 저장 및 연산할 때 쓰이면 좋습니다.
3. https://dev.mysql.com/doc/refman/8.0/en/charset-charsets.html 를 통해서 MySQL이 지원하는 character sets를 볼 수 있으며 VARCHAR(10) CHARACTER SET UTF8;은 30바이트의 크기를 가지며 ASCII 일 때는 10바이트의 크기를 가집니다.
1. 다음과 같은 오류를 출력한다. `Data too long for column ... at row ...`
2. varchar와 char은 실제 할당 저장 공간에 차이가 있고, 문자열 비교 방법이 다르다. varchar는 지정한 최대 길이 내에서 각 데이터 크기에 맞게 가변적으로 저장 공간을 준다. char은 지정한 길이 만큼 공백을 채워 고정된 저장 공간을 할당한다. 대신 char는 추가로 연산할 필요가 없기에 검색 속도가 월등히 빠르다. 문자열 비교에서도 두 타입은 차이가 있다(링크 참고). 이름, 주소 등 길이가 다양한 경우엔 varchar를 써서 저장 공간을 줄이고, 주민등록번호 같이 길이가 일정하면 char를 쓰는 게 좋다.
출처: https://hyeonstorage.tistory.com/290
https://hack-cracker.tistory.com/165
3. 텍스트 encoding(character set)에 따른 max length는 mysql document에서 자세히 확인할 수 있다. 각 encoding character의 문자 1개에 할당 가능한 최대 byte가 max_len으로 명시되어 있다. 같은 encoding이라도 character에 따라 작은 크기의 공간을 할당할 수 있다.
출처: https://dev.mysql.com/doc/refman/8.0/en/charset-charsets.html
https://stackoverflow.com/questions/16113066/meaing-of-maxlen-in-information-schema-character-sets-table-of-mysql
1. 오류로 바꿔지지 않습니다.
2 .varchar는 가변길이로, 정해진 길이까지 데이터 입력이 가능합니다. char의 경우 정해진 길이보다 데이터가 적으면 공백으로 채워 저장합니다. 길이가 고정된 값일경우 char타입으로 저장하면 좋을것 같습니다. 그렇지 않은 경우에는 varchar타입으로 저장공간을 절약하는것이 좋을것 같습니다.
3. UTF-8은 원래 가변4바이트이지만 MYSQL에서는 가변3바이트로 만들었습니다. 후에 Emoji문자들이 4바이트를 사용해, UTF-8mb4를 만들어 가변4바이트가 가능해졋습니다.