Skip to content
난이도 출제 빈출문제은행 5

DDL: CREATE·ALTER·DROP ​

DDL(Data Definition Language, 데이터 정의어)은 테이블·뷰·인덱스(index) 같은 데이터베이스 구조를 만들고, 바꾸고, 지우는 SQL이다. 데이터 자체를 다루는 DML(Data Manipulation Language, 데이터 조작어)과 달리 그릇의 모양을 정한다. 시험은 명령어 세 개의 역할, ALTER TABLE의 빈칸, DROP의 CASCADE·RESTRICT 차이를 단답형으로 묻는다.

명령어 세 가지 ​

명령어하는 일대상 예
CREATE새 객체를 만든다SCHEMA, DOMAIN, TABLE, VIEW, INDEX
ALTER이미 있는 테이블 정의를 바꾼다TABLE
DROP객체를 통째로 없앤다SCHEMA, DOMAIN, TABLE, VIEW, INDEX

CREATE TABLE과 제약 조건 ​

CREATE TABLE은 열 이름과 자료형을 정하면서 제약 조건(constraint)을 함께 건다. 제약 조건은 잘못된 값이 들어오지 못하게 막는 규칙이다. 기본키(primary key)는 행을 하나로 가려내는 열이라 중복과 NULL이 안 된다. 외래키(foreign key)는 다른 테이블의 기본키 값만 넣을 수 있게 한다.

sql
CREATE TABLE 수강 (
  학번 INTEGER REFERENCES 학생(학번) ON DELETE CASCADE,
  과목 VARCHAR(10) NOT NULL,
  PRIMARY KEY (학번, 과목)
);

NOT NULL은 빈 값 금지, UNIQUE는 중복 금지, CHECK (점수 BETWEEN 0 AND 100)은 값의 범위를 제한한다. ON DELETE CASCADE는 학생 행이 지워지면 그 학생의 수강 행도 따라 지우라는 뜻이다. 예제 수강 테이블(5행)에서 학생 1001을 지우자 1001의 수강 2행이 함께 지워져 3행이 됐다. 이 옵션이 없으면 참조 중인 행은 지울 수 없어 오류가 난다.

CREATE VIEW 이름 AS SELECT …는 조회 결과에 이름을 붙인 가상 테이블인 뷰(view)를 만든다. CREATE [UNIQUE] INDEX 이름 ON 테이블(열 [ASC|DESC])는 인덱스를 만든다. 인덱스는 열 값을 미리 정리해 두어 그 열로 조회할 때 전체 행을 훑지 않게 하는 구조다. UNIQUE를 붙이면 그 열에 중복 값이 들어오지 않고, 정렬 방향을 생략하면 ASC다.

ALTER TABLE ​

ALTER TABLE은 테이블을 지우지 않고 정의만 고친다. 데이터를 다시 넣을 필요가 없어서 운영 중인 테이블에 열을 추가할 때 쓴다.

형식하는 일
ALTER TABLE 학생 ADD 전화 VARCHAR(20);열 추가
ALTER TABLE 학생 ALTER 학년 SET DEFAULT 1;열의 기본값 변경
ALTER TABLE 학생 DROP COLUMN 전화;열 삭제

열의 자료형 변경 문법은 제품마다 다르다. 표준은 ALTER COLUMN … SET DATA TYPE, PostgreSQL은 ALTER COLUMN … TYPE, Oracle·MySQL은 MODIFY를 쓴다. 시험 답안은 자료형 변경도 ALTER 열이름 새자료형 꼴로 쓰는데, 실제 DBMS는 이 형식을 받지 않는 시험 표기다.

DROP과 CASCADE·RESTRICT ​

DROP TABLE 학생 CASCADE;는 학생 테이블과 함께 이를 참조하는 뷰·제약 조건까지 지운다. RESTRICT는 다른 객체가 참조 중이면 삭제를 거부한다. PostgreSQL은 RESTRICT가 기본값이다. Oracle은 CASCADE CONSTRAINTS로 쓰고, MySQL은 두 키워드를 받기만 하고 아무 일도 하지 않는다.

DROP은 구조까지 없애고, DML의 DELETE는 행만 지우고 테이블은 남긴다. 둘 사이의 TRUNCATE는 구조를 남기고 모든 행을 한 번에 비운다.

시험 포인트 ​

  • 구조 정의 언어 → DDL: CREATE, ALTER, DROP.
  • 열 추가 ADD, 기본값 변경 ALTER … SET DEFAULT, 열 삭제 DROP COLUMN.
  • 참조하는 객체까지 함께 삭제 → CASCADE. 참조 중이면 거부 → RESTRICT.
  • 중복 없는 인덱스 → CREATE UNIQUE INDEX. 정렬 생략 시 ASC.
  • 테이블 자체 제거 DROP vs 행만 제거 DELETE.

관련 문서