DDL 개요 CREATE TABLE 제약조건 FOREIGN KEY ALTER · DROP 📝 문제풀이
◀ 이전 📋 목차 CH 10 ▶
🏗️ CHAPTER 09 · 고급

테이블을 만들고, 제약으로 지킨다

지금까지는 이미 있는 테이블의 데이터를 다뤘어요. 이번 장은 데이터가 아니라 테이블 그 자체(틀)만들고·바꾸고·지우는 DDL이에요. 그리고 잘못된 데이터가 못 들어오게 막는 제약조건까지 배웁니다.

🎯 이 장을 끝내면
📖
DDL 개요
데이터가 아니라 "틀"을 다룬다
DDL = Data Definition Language, 데이터 정의어예요.

지금까지 배운 SELECT·INSERT·UPDATE·DELETE는 이미 만들어진 테이블 안의 데이터를 다뤘어요. 그런데 그 테이블은 누가, 어떻게 만들었을까요? 바로 DDL(Data Definition Language)이에요. DDL은 테이블이라는 틀 자체를 만들고·바꾸고·지우는 명령어 갈래예요.

명령어하는 일비유
CREATE TABLE새 테이블(틀)을 만든다빈 표 양식을 새로 그림
ALTER TABLE기존 테이블 구조를 바꾼다양식에 칸을 추가·수정
DROP TABLE테이블 자체를 없앤다표 양식을 통째로 폐기
☕ 자바에 비유하면 DDL클래스를 정의하는 일에 가까워요 — 어떤 필드(열)를 가질지, 타입은 뭔지 틀(class)을 설계하죠.
DML(INSERT·UPDATE 등)은 그 클래스로 객체(row)를 만들고 값을 바꾸는 일에 가까워요. 즉 "테이블 정의 = 클래스 설계, 행 하나 = 인스턴스"라고 보면 감이 잡혀요.
DDL CREATE TABLE ALTER TABLE DROP TABLE PRIMARY KEY NOT NULL UNIQUE DEFAULT FOREIGN KEY 참조 무결성
🧭
DDL vs DML 한 줄 정리. DDL은 "틀(구조)"을, DML은 "내용(데이터)"을 다뤄요. 이번 장의 명령어들은 전부 구조를 건드린다는 점만 기억하고 읽으면 됩니다.
🏗️
CREATE TABLE
테이블을 새로 만들기
열 이름 + 자료형 + 제약을 나란히 적어요.

CREATE TABLE테이블 이름을 정하고, 괄호 안에 열마다 "이름 자료형 [제약]"을 쉼표로 나열해요.

🔤
자료형(data type) — 그 열에 어떤 종류의 값을 담을지 미리 정해두는 규칙이에요. INT는 정수만, VARCHAR는 문자열만 담을 수 있어요. 정해둔 종류와 안 맞는 값(예: 숫자 칸에 글자)은 저장이 거부돼요.
CREATE TABLE users (
  id    INT          PRIMARY KEY,   -- 열 이름 + 자료형 + 제약
  name  VARCHAR(50)  NOT NULL,      -- 최대 50자, 빈 값 금지
  age   INT                         -- 자료형만 (제약 없음)
);

각 줄은 ① 열 이름 → ② 자료형 → ③ 제약조건(선택) 순서예요. 대표적인 자료형은 다음과 같아요.

자료형저장하는 것예시 값
INT정수1, 42, -7
VARCHAR(n)가변 길이 문자열 (최대 n자)'철수', 'a@b.com'
CHAR(n)고정 길이 문자열 (항상 n자)'M', 'KR'
DATE날짜'2026-07-07'
DECIMAL(p,s)정확한 소수 (금액 등)1500.50
🔤 VARCHAR vs CHAR VARCHAR(50)가변 길이. '철수'를 넣으면 딱 그만큼만 써요. 이름·이메일처럼 길이가 들쭉날쭉한 값에 알맞아요.
CHAR(2)고정 길이. 항상 정해진 칸을 차지해요. 국가코드('KR')처럼 길이가 일정한 값에 써요. ☕ 자바의 String과 비슷하지만, DB에서는 최대 길이를 미리 정해둔다는 점이 달라요.
💡
제약조건은 여러 개를 함께 붙일 수 있어요. 예를 들어 email VARCHAR(100) NOT NULL UNIQUE는 "빈 값 금지 + 중복 금지"를 동시에 건 거예요.
🛡️
제약조건
잘못된 데이터를 애초에 막는다
제약(constraint)은 "이런 값은 못 들어와"라는 규칙이에요.

제약조건(constraint)은 열에 규칙을 걸어, 규칙에 어긋나는 데이터가 저장되지 못하게 막아요. 데이터의 정확성·일관성을 DB가 대신 지켜주는 셈이에요.

제약의미깨지는 예
PRIMARY KEY행을 고유하게 식별하는 열. 유일 + NOT NULL을 동시에 보장같은 id가 두 번 / id가 비어 있음
NOT NULL빈 값(NULL) 금지 — 반드시 값이 있어야 함name 없이 행을 넣으려 함
UNIQUE그 열의 값이 중복되면 안 됨 (단, 비어 있는 건 허용)이미 있는 email을 또 넣음
DEFAULT값을 안 주면 넣어줄 기본값(막는 게 아니라 자동 채움)
CHECK값이 조건을 만족해야 함age < 0 같은 값을 막음
CREATE TABLE members (
  id     INT          PRIMARY KEY,          -- 유일 + NOT NULL
  email  VARCHAR(100) NOT NULL UNIQUE,      -- 빈 값 금지 + 중복 금지
  grade  VARCHAR(10)  DEFAULT 'BRONZE',     -- 안 주면 'BRONZE'
  age    INT          CHECK (age >= 0)      -- 음수 나이 차단
);
🔑 PRIMARY KEY vs UNIQUE PRIMARY KEY — 테이블당 하나. 자동으로 유일 + NOT NULL. 행을 대표하는 "주민번호" 같은 열이에요.
UNIQUE — 여러 개 걸 수 있고, 빈 값(NULL)은 허용돼요. "중복만 막고 싶을 때" 써요. 💡 그래서 id는 PRIMARY KEY로, email은 (기본키는 아니지만 중복은 곤란하니) UNIQUE로 거는 조합이 흔해요.
🚫
NULL이 뭐였죠? NULL은 "값이 아직 없음/모름"을 뜻하는 특별한 상태예요. NOT NULL은 바로 그 빈 상태를 금지해서, "이 열은 반드시 채워라"라고 강제하는 제약이에요.
🔗
FOREIGN KEY
외래 키 — 테이블끼리 관계를 맺는다
다른 테이블의 PK를 참조해, 존재하는 값만 허용해요.

외래 키(FOREIGN KEY)는 한 테이블의 열이 다른 테이블의 기본 키(PK)를 참조하도록 걸어, 두 테이블을 연결하는 제약이에요. 예를 들어 orders(주문) 테이블의 user_idusers 테이블의 id를 참조하게 하면, 실제로 존재하는 사용자의 주문만 허용돼요.

users 테이블 (부모)
id (PK)name
1'철수'
2'영희'
orders 테이블 (자식) — user_id가 users.id를 참조 (FK)
id (PK)user_id (FK)item
1011'키보드'
1022'마우스'
CREATE TABLE orders (
  id       INT PRIMARY KEY,
  user_id  INT,
  item     VARCHAR(50),
  FOREIGN KEY (user_id) REFERENCES users(id)   -- users.id를 참조
);
🧱 참조 무결성 (Referential Integrity) 외래 키가 있으면 존재하지 않는 사용자의 주문을 넣을 수 없어요. user_id = 99인 사용자가 users에 없다면, 그 주문 INSERT거부돼요.
반대로, 주문이 걸려 있는 사용자를 함부로 삭제하는 것도 막혀요 — "주인 없는 주문"이 생기니까요. 이렇게 "참조가 항상 유효하도록" 지켜주는 성질을 참조 무결성이라 불러요. 데이터가 서로 어긋나는 걸 DB가 막아주는 거예요.
자바 객체로 보면, OrderUser참조(reference)하는 것과 비슷해요. 다만 DB에서는 그 참조가 실제 존재하는 행을 가리키도록 강제한다는 점이 핵심이에요.
🔧
ALTER · DROP
구조를 바꾸고, 테이블을 지운다
그리고 DROP과 DELETE는 전혀 다르다는 점!

ALTER TABLE은 이미 만든 테이블의 구조를 변경해요. 열을 추가·삭제하거나 이름을 바꿀 수 있어요.

ALTER TABLE users ADD COLUMN email VARCHAR(100);  -- 열 추가
ALTER TABLE users DROP COLUMN age;                -- 열 삭제

DROP TABLE테이블 자체를 통째로 삭제해요. 데이터는 물론 구조(틀)까지 사라져요.

DROP TABLE users;   -- users 테이블이 통째로 없어짐 (구조 + 데이터)
⚠️ DROP TABLE vs DELETE — 헷갈리면 큰일 DELETE (DML) — 테이블 안의 행(데이터)만 지워요. 테이블(틀)은 그대로 남아, 다시 INSERT할 수 있어요.
DROP TABLE (DDL)테이블 자체를 없애요. 구조까지 사라져서, 다시 쓰려면 CREATE부터 해야 해요. 한 줄 정리: DELETE = 표 안의 줄을 지움 / DROP = 표 양식을 폐기. DROP은 되돌리기 어려우니 특히 조심하세요.
🎁 보너스 · TRUNCATE
모든 행을 빠르게 비우고 싶다면 TRUNCATE TABLE users;도 있어요. 구조는 남기고 데이터만 전부 지운다는 점에서 결과는 DELETE와 비슷하지만, 훨씬 빠르고 되돌리기 어렵다는 차이가 있어요.
⚠️
DDL(CREATE·ALTER·DROP)은 대개 자동 커밋(실행하자마자 자동으로 확정·저장되는 것 — 커밋은 CH 10에서 배워요)되어 즉시 반영되고, DELETE처럼 롤백으로 되돌리기가 어렵습니다. 특히 DROP TABLE은 실행 전에 한 번 더 확인하는 습관을 들이세요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 쿼리결과)을 섞어 두었어요.
CH 10 ⚙️ 인덱스·뷰·트랜잭션 — 성능과 안정성을 위한 마지막 도구들