CREATE·ALTER·DROP·TRUNCATE·RENAME으로 테이블 구조를 만들고 바꾸고 지웁니다. CTAS가 복사하는 것, ALTER 변경 규칙, 제약조건의 NULL 처리, DELETE·TRUNCATE·DROP의 차이를 기출 중심으로 익힙니다.
최빈출기출 11회분 중 62문항 · 많이 나온 주제: 제약조건(39), CREATE/ALTER/DROP(33), 참조동작(10)
학습 목표
CREATE·ALTER·DROP·TRUNCATE·RENAME으로 테이블 구조를 만들고 바꾸고 지웁니다. CTAS가 복사하는 것, ALTER 변경 규칙, 제약조건의 NULL 처리, DELETE·TRUNCATE·DROP의 차이를 기출 중심으로 익힙니다.
01
DDL 한눈에 보기
DDL(Data Definition Language)은 테이블·뷰·인덱스 같은 객체의 구조를 만들고 바꾸고 지우는 명령입니다. CREATE(생성), ALTER(변경), DROP(삭제), TRUNCATE(데이터만 비움), RENAME(이름 변경)이 있습니다.
DDL은 실행하는 순간 자동 COMMIT됩니다. 실행 전에 남아 있던 미확정 DML까지 함께 확정되므로, DDL 뒤에는 ROLLBACK으로 되돌릴 수 없습니다. 뷰는 서브쿼리 단원에서, 인덱스는 '검색은 빨라지지만 입력·수정은 느려질 수 있는 목차'로 기억하면 됩니다.
개념 정리DDL 명령
CREATE
객체 생성
테이블·뷰·인덱스 · CREATE TABLE ... AS SELECT(CTAS)
ALTER
구조 변경
열·제약조건 추가·변경·삭제 · 이름 변경
DROP
객체 삭제
구조와 데이터 모두 사라짐
TRUNCATE
데이터만 비움
구조는 남김 · WHERE 불가 · ROLLBACK 불가
DDL은 자동 COMMIT
실행 순서
미확정 DML→
ALTER TABLE ...→
앞의 DML까지 자동 COMMIT→
ROLLBACK 불가
02
CREATE와 CTAS
CREATE TABLE 테이블명 (열 타입 [제약조건], ...)으로 테이블을 만듭니다. 테이블·열 이름은 영문자로 시작하고 A–Z, a–z, 0–9, _, $, #만 쓸 수 있으며, 예약어는 쓸 수 없고 같은 사용자 안에서 중복될 수 없습니다. 길이는 시험 기준 30바이트입니다.
CTAS(CREATE TABLE ... AS SELECT)는 조회 결과로 새 테이블을 만들면서 데이터까지 복사합니다. 이때 넘어가는 것은 열 이름·데이터 타입·크기와 NOT NULL 제약뿐입니다. PK·FK·UNIQUE·CHECK 제약과 DEFAULT 값은 복사되지 않으므로 필요하면 다시 만들어야 합니다. SELECT에 별칭을 붙이면 그 별칭이 새 열 이름이 됩니다.
CREATETABLEEMP(
EMP_ID NUMBERPRIMARYKEY,
NAME VARCHAR2(50)NOTNULL,
SAL NUMBERDEFAULT0,
DEPT_ID VARCHAR2(10),
HIRE_DATE DATEDEFAULTSYSDATE,CONSTRAINT FK_EMP_DEPT FOREIGNKEY(DEPT_ID)REFERENCESDEPT(DEPT_ID));-- CTAS: 구조 + 데이터 복사 (제약은 NOT NULL만)CREATETABLE EMP_COPY ASSELECT EMP_ID, NAME, SAL FROM EMP;
CTAS로 복사하면 남는 제약조건
EMP (원본)
COLUMN
TYPE
CONSTRAINT
EMP_ID
NUMBER
PRIMARY KEY
NAME
VARCHAR2(50)
NOT NULL
SAL
NUMBER
DEFAULT 0
CTAS→타입·크기·NOT NULL만
EMP_COPY (CTAS)
COLUMN
TYPE
CONSTRAINT
EMP_ID
NUMBER
—
NAME
VARCHAR2(50)
NOT NULL
SAL
NUMBER
—
NOT NULL만 따라오고 PK와 DEFAULT는 사라집니다. 타입과 크기는 그대로입니다.
03
제약조건: PK·FK·UNIQUE·NOT NULL·CHECK
제약조건(Constraint)은 데이터베이스가 지켜야 할 규칙을 직접 선언하는 기능입니다. 예약번호의 중복을 막고, 존재하지 않는 방문객에게 예약이 연결되지 못하게 할 수 있습니다. 텍스트 파일에서는 프로그램이 이런 규칙을 직접 검사해야 하지만, 관계형 DB에서는 정의된 제약조건을 DBMS가 검사합니다.
예약번호는 기본키, 방문객번호는 외래키, 방문일은 필수값으로 설정할 수 있습니다. 예약 인원이 1명 미만이면 안 된다는 규칙에는 CHECK (TICKET_COUNT >= 1)을 씁니다. 외래키가 있다고 해서 자동으로 NOT NULL이 되는 것은 아니므로, 이 예제에서는 예약이 반드시 방문객을 참조하도록 FK 열에 NOT NULL도 함께 지정합니다.
SQLD에서 구분하는 주요 제약조건
제약조건
보장하는 규칙
꼭 알아둘 점
PRIMARY KEY
유일성 + NOT NULL
테이블의 대표 행 식별자
UNIQUE
지정한 값들의 중복 제한
Oracle의 단일 열 UNIQUE는 NULL을 허용하며 여러 NULL도 가능
NOT NULL
값이 반드시 존재
NULL 입력을 거부
CHECK
조건에 맞는 값만 허용
CHECK만으로 NULL을 금지하지는 않음
FOREIGN KEY
참조하는 부모 키가 존재해야 함
NULL 허용 여부는 별도로 결정
같은 이름의 방문객이 여러 명일 수 있으므로 이름을 PK로 잡으면 위험합니다. 반대로 시스템이 부여한 VISITOR_ID는 안정적인 식별자 후보가 됩니다. PK와 UNIQUE의 차이, FK와 NOT NULL의 차이는 제약조건 문제의 핵심 구분입니다.
키가 될 수 있는 최소 속성 집합을 후보키(Candidate Key), 그중 대표로 고른 것을 기본키, 나머지 후보키를 대체키(Alternate Key)라고 합니다. 예를 들어 보관번호가 기본키라면 중복되지 않는 운송장번호는 대체키 후보입니다. NULL을 허용하는 단일 열 UNIQUE가 그대로 후보키가 되는 것은 아닙니다.
CHECK는 조건이 FALSE일 때만 거부합니다. 값에 NULL이 섞여 조건이 UNKNOWN이 되면 통과합니다. 예를 들어 CHECK (A > 10 AND B > 5)에 (20, NULL)을 넣으면 TRUE AND UNKNOWN = UNKNOWN이라 입력에 성공합니다. NULL을 막으려면 CHECK (열 IS NOT NULL)이나 NOT NULL을 씁니다.
이 행에 NULL을 넣을 수 있나? — `T(가 PK, 나 NOT NULL, 다 UNIQUE, 라 CHECK(라 IS NOT NULL))`
열
제약조건
NULL 입력
가
PRIMARY KEY
불가 (PK = UNIQUE + NOT NULL)
나
NOT NULL
불가
다
UNIQUE
가능
라
CHECK (라 IS NOT NULL)
불가 (조건이 FALSE)
-- 부모 행을 지울 때 자식 FK를 어떻게 할지 지정FOREIGNKEY(DEPT_ID)REFERENCESDEPT(DEPT_ID)ONDELETECASCADE-- 부모 삭제 시 자식 행도 삭제-- ON DELETE SET NULL -- 부모 삭제 시 자식 FK를 NULL로
04
ALTER
ALTER TABLE로 이미 만든 테이블의 구조를 바꿉니다. 열 추가는 ADD, 타입·크기·기본값 변경은 Oracle MODIFY(SQL Server는 ALTER COLUMN), 열 이름 변경은 RENAME COLUMN, 열 삭제는 DROP COLUMN입니다. 제약조건은 ADD CONSTRAINT, DROP CONSTRAINT 이름으로 추가·삭제하고, PK는 DROP PRIMARY KEY로도 지울 수 있습니다. DROP FOREIGN KEY라는 구문은 없습니다.
MODIFY 규칙은 기존 데이터를 담을 수 있는가가 기준입니다. 열 크기를 늘리는 것은 항상 가능하지만, 크기를 줄이거나 타입을 바꾸는 것은 기존 데이터와 맞지 않으면 오류입니다(열이 비어 있으면 가능). 또 기존 행에 NULL이 있으면 NOT NULL을 추가할 수 없고, 중복이나 NULL이 있으면 PK를 추가할 수 없습니다.
-- 열 추가 → 크기 확대(항상 가능) → 이름 변경 → 삭제ALTERTABLE EMP ADD(PHONE VARCHAR2(20));ALTERTABLE EMP MODIFY(PHONE VARCHAR2(30));ALTERTABLE EMP RENAMECOLUMN PHONE TO MOBILE;ALTERTABLE EMP DROPCOLUMN MOBILE;-- 제약조건 추가·삭제 (FK도 이름으로 삭제)ALTERTABLE EMP ADDCONSTRAINT UQ_NAME UNIQUE(NAME);ALTERTABLE EMP DROPCONSTRAINT UQ_NAME;ALTERTABLE EMP DROPPRIMARYKEY;
ALTER는 구조만 바꾼다
EMP 열 5개
COLUMN
TYPE
EMP_ID
NUMBER
NAME
VARCHAR2(50)
SAL
NUMBER
DEPT_ID
VARCHAR2(10)
HIRE_DATE
DATE
ALTER→ADD PHONE(20) → MODIFY 30
ADD → MODIFY 후 6개
COLUMN
TYPE
EMP_ID
NUMBER
NAME
VARCHAR2(50)
SAL
NUMBER
DEPT_ID
VARCHAR2(10)
HIRE_DATE
DATE
PHONE
VARCHAR2(30)
데이터가 있는 열을 MODIFY할 때 — 이름 VARCHAR2(20)에 최대 15자, 급여 NUMBER(8,2)에 정수부 6자리
변경
결과
이유
급여 → NUMBER(10,2)
성공
크기 확대
급여 → NUMBER(4,2)
오류
6자리 값이 안 들어감
이름 → VARCHAR2(10)
오류
15자 값이 안 들어감
사번 NUMBER → DATE
오류
호환되지 않는 타입
05
DELETE·TRUNCATE·DROP 비교
TRUNCATE는 테이블의 모든 행을 지우고 구조는 남깁니다. DDL이라 WHERE를 쓸 수 없고 자동 COMMIT되어 ROLLBACK할 수 없습니다. DROP은 테이블 객체 자체를 지워 구조·데이터·인덱스가 모두 사라집니다. 행을 골라 지우고 되돌릴 여지를 두려면 DML인 DELETE를 씁니다.
다른 테이블의 FK가 참조하는 부모 테이블은 그냥 DROP할 수 없습니다. DROP TABLE 부모 CASCADE CONSTRAINTS를 쓰면 부모 테이블과 함께 자식 테이블의 FK 제약만 지웁니다. 자식 테이블과 데이터는 남습니다. 표준 SQL의 RESTRICT는 의존 객체가 있으면 삭제를 거부합니다. 이름 변경은 RENAME EMP TO EMPLOYEE 또는 ALTER TABLE EMP RENAME TO EMPLOYEE입니다.
모든 행을 지우는 세 가지
비교
DELETE
TRUNCATE
DROP
분류
DML
DDL
DDL
WHERE
가능
불가
—
구조
유지
유지
삭제
ROLLBACK
가능
불가 (자동 COMMIT)
불가 (자동 COMMIT)
TRUNCATE와 DROP의 차이
EMP 3행
EMP_ID
NAME
1
김
2
이
3
박
TRUNCATE→데이터만 비움
TRUNCATE 후 — 구조만
EMP_ID
NAME
(0행)
DROP→테이블 자체 삭제
DROP 후
객체
EMP 없음
-- 자식의 FK 제약만 함께 삭제 (자식 테이블은 남음)DROPTABLE DEPT CASCADE CONSTRAINTS;-- 휴지통을 거치지 않고 바로 삭제DROPTABLE EMP PURGE;-- 테이블 이름 변경RENAME EMP TO EMPLOYEE;
06
Oracle 주요 자료형: 문자·숫자·날짜와 시간
테이블을 만들 때 각 열에는 어떤 종류의 값을 담을지 자료형(Data Type)을 정합니다. 방문객 이름은 문자, 예약 수량은 숫자, 방문 예정일은 날짜가 자연스럽습니다. 자료형을 알맞게 고르면 부적절한 입력을 줄이고 SQL에서 올바르게 비교·계산할 수 있습니다.
Oracle에서는 문자열 자료형으로 CHAR와 VARCHAR2를 자주 씁니다. CHAR(n)은 고정 길이 문자형이라 짧은 값을 넣으면 나머지가 공백으로 채워지고, VARCHAR2(n)은 가변 길이 문자형이라 입력한 데이터 길이만큼 저장합니다. 한글 길이까지 분명히 하고 싶으면 VARCHAR2(40 CHAR)처럼 문자 수 기준을 명시합니다.
Oracle의 대표 자료형
자료형
의미
예약 시스템 예시와 주의점
CHAR(5)
고정 길이 문자
'AB' 저장 시 오른쪽 공백 3개를 채워 5자리로 저장
VARCHAR2(40 CHAR)
최대 40문자의 가변 길이 문자열
방문객 이름 윤가은
NUMBER(7, 2)
전체 유효 숫자 최대 7자리, 소수 자리 2자리
12345.67 (정수부는 최대 5자리)
NUMBER(3)
정수 자릿수 최대 3자리
예약 인원 2
DATE
연·월·일과 시·분·초까지 저장
DATE '2026-11-03'의 시간은 자정
TIMESTAMP
날짜·시간과 소수초까지 저장
예약 생성 시각 2026-11-03 09:10:11.123456
특히 Oracle의 DATE는 날짜만 저장하는 타입이 아닙니다. 시·분·초 정보도 들어 있으며, DATE '2026-11-03' 같은 날짜 리터럴은 시간이 00:00:00으로 설정됩니다. 화면에 날짜만 보인다고 해서 DB에 시간이 없다고 판단하면 안 됩니다. 소수초가 필요하면 TIMESTAMP를 씁니다.
보충 실습여기부터는 테이블을 직접 만들어 보는 긴 SQL 실습입니다. 처음 공부할 때는 건너뛰고, 위 내용을 이해한 뒤 돌아와도 됩니다.
07
SQL 실전: CREATE → ALTER → TRUNCATE → DROP 추적
보충 실습
EMP를 만들고, PHONE 열을 더한 뒤, TRUNCATE와 DROP을 차례로 실행합니다. 데이터·구조·테이블 자체가 어느 명령에서 사라지는지 비교합니다. 모두 DDL이라 실행 즉시 자동 COMMIT됩니다.
CREATETABLEEMP(
EMP_ID NUMBERPRIMARYKEY,
NAME VARCHAR2(50)NOTNULL,
SAL NUMBERDEFAULT0);ALTERTABLE EMP ADD(PHONE VARCHAR2(20));TRUNCATETABLE EMP;DROPTABLE EMP;
명령별 상태
명령
구조
데이터
ROLLBACK
CREATE TABLE EMP
새로 생성
0행
불가
ALTER ... ADD PHONE
열 추가
유지
불가
TRUNCATE TABLE EMP
유지
모두 비움
불가
DROP TABLE EMP
객체 삭제
—
불가
참고: 시험은 'SQL 전문가 가이드' 기준으로 '크기 축소는 데이터를 담을 수 있을 때만'으로 답합니다. 실제 Oracle도 VARCHAR2는 기존 값이 새 길이에 들어가면 줄일 수 있지만, NUMBER의 자릿수 축소는 열이 비어 있어야 합니다.