DDL(CREATE·ALTER·DROP·TRUNCATE)
쉽게 말하면
DDL은 표의 '틀'을 만들고 바꾸는 명령이에요. 표를 새로 만들고(CREATE), 칸을 더하거나 바꾸고(ALTER), 표를 통째로 지워요(DROP). TRUNCATE는 틀은 두고 내용만 모두 비워요. Oracle에서 DDL은 실행하자마자 자동으로 확정돼서 되돌릴 수 없어요.
시험용 정의
DDL(Data Definition Language)은 테이블 같은 객체의 구조를 만들고 바꾸는 명령이다. CREATE TABLE(만들기), ALTER TABLE(열 추가·변경·삭제, 제약조건 추가), DROP TABLE(테이블 삭제), TRUNCATE TABLE(모든 행 삭제, 구조 유지), RENAME(이름 변경). Oracle에서 DDL은 자동 커밋된다. 열을 만들 때는 데이터 유형(CHAR, VARCHAR2, NUMBER, DATE)을 정한다.
비유로 이해하기
엑셀 시트로 치면 DML은 칸에 값을 쓰는 것, DDL은 시트를 새로 만들고(CREATE), 열을 끼워 넣거나 지우고(ALTER), 시트를 통째로 지우는(DROP) 것이다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 객체 | 테이블, 뷰, 인덱스처럼 데이터베이스 안에 만드는 것 |
| 데이터 유형 | 열에 들어갈 값의 종류와 크기. NUMBER(7,2)는 전체 7자리 중 소수 2자리 |
| CTAS | CREATE TABLE … AS SELECT. 조회 결과로 새 테이블을 만든다 |
| DEFAULT | INSERT에서 값을 주지 않았을 때 들어갈 기본값 |
데이터 유형
| 유형 | 뜻 | 메모 |
|---|---|---|
| CHAR(n) | 고정 길이 문자 | 남는 자리를 공백으로 채움. 비교할 때 짧은 쪽에 공백을 붙여 비교 |
| VARCHAR2(n) | 가변 길이 문자 (Oracle) | 실제 길이만큼. SQL Server는 VARCHAR. 공백도 글자로 비교 |
| NUMBER(p, s) | 숫자, 전체 p자리 중 소수 s자리 | SQL Server는 INT, NUMERIC, DECIMAL 등 |
| DATE | 날짜와 시각 (초 단위) | SQL Server는 DATETIME |
명령 모양
| 명령 | 예 |
|---|---|
| CREATE TABLE | CREATE TABLE member (id NUMBER(5) PRIMARY KEY, name VARCHAR2(20) NOT NULL, joined DATE DEFAULT SYSDATE) |
| CTAS | CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno = 20 (NOT NULL만 복사, PK·FK 등은 안 됨) |
| 열 추가 | ALTER TABLE member ADD (email VARCHAR2(40)) (새 열은 맨 뒤, 기존 행은 NULL) |
| 열 변경 | ALTER TABLE member MODIFY (name VARCHAR2(30)) (SQL Server는 ALTER COLUMN) |
| 열 삭제 | ALTER TABLE member DROP COLUMN email |
| 열 이름 변경 | ALTER TABLE member RENAME COLUMN name TO mname |
| 테이블 이름 변경 | RENAME member TO users (SQL Server는 sp_rename) |
| 모든 행 삭제 | TRUNCATE TABLE member |
| 테이블 삭제 | DROP TABLE member [CASCADE CONSTRAINTS] (참조하는 FK까지 지우기) |
알아 둘 규칙
- 테이블·열 이름은 문자로 시작, A-Z a-z 0-9 _ $ # 사용, 예약어 불가, 같은 사용자 안에서 테이블 이름 중복 불가
- MODIFY로 크기를 줄이거나 형을 바꿀 때 기존 데이터가 맞지 않으면 오류
- NOT NULL 제약을 추가하려면 기존 행에 NULL이 없어야 한다
- CTAS는 열 이름·형·NOT NULL만 복사한다. 기본키·외래키·CHECK·DEFAULT는 복사되지 않는다
- 구조만 복사하려면
CREATE TABLE t AS SELECT * FROM emp WHERE 1 = 2
시험에 이렇게 나와요
- CHAR(고정, 공백 채움) vs VARCHAR2(가변) 비교 결과
- ALTER TABLE 문법 (ADD, MODIFY, DROP COLUMN, RENAME COLUMN), Oracle과 SQL Server 차이
- DELETE·TRUNCATE·DROP 비교
- CTAS는 NOT NULL 제약만 복사
- 테이블·열 이름 규칙
출제 범위·공식 안내 기반
확인 문제
Q1. CHAR(10) 열에 'SQL'을 저장하면 실제로 몇 글자를 차지할까요?
- 10
- 4
- 3
- NULL
정답 보기
1번 10
CHAR는 고정 길이라 남는 자리를 공백으로 채워 항상 10자리를 차지한다. VARCHAR2(가변 길이)는 실제 길이 3만 쓴다.
Q2. CREATE TABLE emp_copy AS SELECT * FROM emp로 복사되는 제약조건은?
- PRIMARY KEY
- CHECK
- FOREIGN KEY
- NOT NULL
정답 보기
4번 NOT NULL
CTAS는 NOT NULL만 복사한다.
Q3. Oracle에서 열의 크기를 바꾸는 올바른 문장은?
- UPDATE TABLE t SET c VARCHAR2(30)
- MODIFY TABLE t c VARCHAR2(30)
- ALTER TABLE t MODIFY (c VARCHAR2(30))
- ALTER TABLE t ALTER COLUMN c VARCHAR2(30)
정답 보기
3번 ALTER TABLE t MODIFY (c VARCHAR2(30))
Oracle은 MODIFY, SQL Server는 ALTER COLUMN.
Q4. CHAR(5) 열 A에 'AB'를, VARCHAR2(5) 열 B에 'AB'를 넣었다. LENGTH(A)와 LENGTH(B)는?
- 2, 2
- 5, 5
- 2, 5
- 5, 2
정답 보기
4번 5, 2
CHAR는 공백으로 채워 5, VARCHAR2는 2.
Q5. 테이블 이름으로 쓸 수 없는 것은?
- SALES#
- EMP_2026
- T$1
- 2026_EMP
정답 보기
4번 2026_EMP
2026_EMP다. 테이블 이름은 문자로 시작해야 한다. 문자로 시작하면 숫자와 _, $, #을 쓸 수 있어 EMP_2026, T$1, SALES#은 된다.
헷갈리기 쉬운 O·X
ALTER TABLE ADD로 추가한 열은 테이블의 맨 앞에 생긴다.
정답 보기
X 맨 뒤에 생기고 기존 행 값은 NULL(또는 DEFAULT).
DROP TABLE은 테이블 구조와 데이터를 모두 삭제한다.
정답 보기
O TRUNCATE는 데이터만, DROP은 구조까지.
VARCHAR2 비교에서는 끝의 공백도 글자로 본다.
정답 보기
O 가변 길이 비교라 'A'와 'A '는 다르다. CHAR끼리면 공백을 채워 비교해 같다.