SQL 명령어는 크게 세 가지로 나뉜다. 테이블 구조를 정의하는 DDL, 데이터를 다루는 DML, 권한을 관리하는 DCL. 이번 글은 그 첫 번째, DDL(Data Definition Language)이다.
DDL은 데이터를 넣기 전에 "어떤 형태로 저장할지"를 먼저 정하는 명령어다. 건물을 짓기 전에 설계도를 그리는 것과 비슷하다.
가장 먼저 쓰게 되는 명령어다. 테이블의 이름과, 어떤 컬럼이 있는지, 각 컬럼의 타입이 뭔지를 정의한다.
CREATE TABLE members (
member_id INT,
member_name VARCHAR(50),
email VARCHAR(100),
created_at DATE
);
각 컬럼 옆에 붙는 INT, VARCHAR(50), DATE 같은 것들이 데이터 타입이다. 이 컬럼에 어떤 종류의 값이 들어올 수 있는지를 미리 정해두는 것이다.
자주 쓰는 타입만 정리하면 이 정도다.
| 타입 | 설명 | 예시 |
|---|---|---|
INT | 정수 | 나이, ID |
VARCHAR(n) | 최대 n자 문자열 | 이름, 이메일 |
TEXT | 긴 문자열 | 상품 설명, 본문 |
DATE | 날짜 (YYYY-MM-DD) | 가입일, 주문일 |
DATETIME | 날짜 + 시간 | 로그인 시각 |
DECIMAL(p, s) | 소수점 포함 숫자 | 가격, 할인율 |
테이블에는 각 행을 구분할 수 있는 고유한 값이 필요하다. 이걸 기본 키(Primary Key)라고 한다. 같은 값이 두 번 들어올 수 없고, NULL도 허용되지 않는다.
CREATE TABLE members (
member_id INT PRIMARY KEY,
member_name VARCHAR(50),
email VARCHAR(100)
);
AUTO_INCREMENT를 붙이면 행이 추가될 때마다 숫자가 자동으로 1씩 올라간다. 직접 ID 값을 넣지 않아도 된다.
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
member_name VARCHAR(50),
email VARCHAR(100)
);
값이 반드시 있어야 하는 컬럼엔 NOT NULL을 붙인다. 이름 없이 회원 가입이 되면 곤란하니까.
CREATE TABLE members (
member_id INT PRIMARY KEY AUTO_INCREMENT,
member_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);

테이블을 만들고 나서 컬럼을 추가하거나 수정해야 할 때 쓴다.
-- members 테이블에 phone 컬럼 추가
ALTER TABLE members ADD phone VARCHAR(20);
-- phone 컬럼의 타입을 변경
ALTER TABLE members MODIFY phone VARCHAR(30);
ALTER TABLE members DROP COLUMN phone;
ALTER TABLE members RENAME TO users;
테이블 자체를 완전히 삭제한다. 안에 있던 데이터도 전부 사라진다.
DROP TABLE members;
되돌릴 수 없다. 실수로 날리면 복구 방법이 없으니 신중하게 써야 한다.
테이블이 없을 때 오류가 나는 게 싫다면 IF EXISTS를 붙인다.
DROP TABLE IF EXISTS members;
테이블 구조는 그대로 두고, 안에 있는 데이터만 전부 비운다.
TRUNCATE TABLE members;
DROP은 테이블 자체를 없애는 거고, TRUNCATE는 테이블은 남기고 내용물만 비우는 차이가 있다.
| 명령어 | 하는 일 |
|---|---|
CREATE | 테이블 생성 |
ALTER | 테이블 구조 변경 (컬럼 추가/수정/삭제) |
DROP | 테이블 삭제 (데이터 포함) |
TRUNCATE | 테이블 내용만 삭제 (구조 유지) |
DDL은 데이터를 넣기 전에 틀을 잡는 작업이다. 한번 잘못 설계하면 나중에 고치는 게 꽤 번거로워서, 처음에 컬럼 타입이나 제약 조건을 꼼꼼히 정해두는 게 좋다.