DDL(Data Definition Language)은 데이터베이스의 객체(Object)인 테이블, 인덱스, 뷰 등의 구조를 생성(CREATE), 변경(ALTER), 삭제(DROP)하는 명령어의 집합임. DDL은 실행 즉시 자동 커밋(Auto Commit)되므로, ROLLBACK으로 작업을 되돌릴 수 없다는 특징이 있음.
DDL (데이터 정의어)
CREATE TABLE - 테이블 생성데이터를 저장할 새로운 테이블의 구조를 정의함. 테이블명, 컬럼명, 데이터 타입, 그리고 각종 제약조건을 포함함.
| 데이터 타입 | 설명 | 예시 |
|---|---|---|
NUMBER(p, s) | 숫자 데이터를 저장함. p는 전체 자릿수, s는 소수점 이하 자릿수. | NUMBER, NUMBER(8), NUMBER(8, 2) |
VARCHAR2(n) | 가변 길이 문자열을 저장함. n은 최대 바이트 수. 할당된 공간만 사용. | VARCHAR2(100) |
CHAR(n) | 고정 길이 문자열을 저장함. n보다 작은 데이터가 들어와도 n 바이트 공간을 모두 차지함. | CHAR(10) |
DATE | 날짜와 시간(시, 분, 초) 정보를 저장함. (Oracle 기준) | SYSDATE |
데이터의 무결성을 보장하기 위해 테이블에 적용되는 규칙.
| 제약조건 | 설명 | 특징 |
|---|---|---|
PRIMARY KEY | 기본 키. 테이블의 각 행을 유일하게 식별하는 값. | NOT NULL + UNIQUE 속성을 가짐. 테이블당 하나만 지정 가능. |
UNIQUE | 고유 키. 해당 컬럼의 모든 값은 유일해야 함. | 중복을 허용하지 않지만, NULL 값은 허용함 (여러 개 가능). |
NOT NULL | 해당 컬럼은 NULL 값을 가질 수 없음. | 반드시 값을 입력해야 함. |
CHECK | 저장될 수 있는 값의 범위나 조건을 지정함. | price >= 0 과 같이 논리식을 사용하여 제약. |
FOREIGN KEY | 외래 키. 다른 테이블의 PRIMARY KEY를 참조하여 테이블 간의 관계를 설정함. | 데이터의 참조 무결성을 보장함. |
DEFAULT | 값이 명시적으로 입력되지 않았을 때 자동으로 저장될 기본값을 지정함. | DEFAULT 0, DEFAULT SYSDATE |
-- Course(강좌) 테이블 생성 예시
CREATE TABLE Course (
course_id NUMBER CONSTRAINT pk_course PRIMARY KEY,
course_name VARCHAR2(100) CONSTRAINT nn_course_name NOT NULL,
price NUMBER(8) DEFAULT 0 CONSTRAINT chk_price CHECK (price >= 0),
start_date DATE DEFAULT SYSDATE
);
-- Enrollment(수강신청) 테이블 생성 및 외래 키 설정 예시
CREATE TABLE Enrollment (
enroll_id NUMBER CONSTRAINT pk_enrollment PRIMARY KEY,
user_id NUMBER,
course_id NUMBER,
-- 외래 키(FK) 제약조건: user_id는 User 테이블의 user_id를 참조함
CONSTRAINT fk_enroll_user FOREIGN KEY (user_id) REFERENCES User(user_id),
-- 외래 키(FK) 제약조건: course_id는 Course 테이블의 course_id를 참조함
CONSTRAINT fk_enroll_course FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
※ 실전 팁: 제약조건에
CONSTRAINT 제약조건명과 같이 명시적으로 이름을 부여하면, 향후 제약조건을 변경하거나 삭제할 때 관리가 용이함.
참조하는 부모 테이블의 행이 삭제될 때, 자식 테이블의 데이터를 어떻게 처리할지 지정하는 옵션. (SQLD 핵심 포인트)
ON DELETE CASCADE: 부모 행이 삭제되면, 해당 행을 참조하는 자식 행도 연쇄적으로 함께 삭제됨.ON DELETE SET NULL: 부모 행이 삭제되면, 자식 행의 해당 FK 컬럼 값이 NULL로 변경됨. (단, FK 컬럼이 NULL을 허용해야 함)-- ON DELETE CASCADE 적용 예시
CONSTRAINT fk_enroll_course FOREIGN KEY (course_id)
REFERENCES Course(course_id) ON DELETE CASCADE;
ALTER TABLE - 테이블 변경이미 생성된 테이블의 구조(컬럼, 제약조건 등)를 변경함.
| 작업 | 구문 | 설명 |
|---|---|---|
| 컬럼 추가 | ADD (컬럼명 타입 [DEFAULT...]) | 테이블에 새로운 컬럼을 추가함. |
| 컬럼 변경 | MODIFY (컬럼명 타입 [DEFAULT...]) | 기존 컬럼의 데이터 타입, 크기, 기본값 등을 변경함. |
| 컬럼 삭제 | DROP COLUMN 컬럼명 | 테이블에서 특정 컬럼을 삭제함. |
| 컬럼 이름 변경 | RENAME COLUMN 기존명 TO 새명 | 컬럼의 이름을 변경함. |
| 테이블 이름 변경 | RENAME 기존테이블명 TO 새테이블명 | 테이블의 이름을 변경함. |
| 제약조건 추가 | ADD CONSTRAINT 명칭 타입 (컬럼) | 테이블에 새로운 제약조건을 추가함. |
| 제약조건 삭제 | DROP CONSTRAINT 명칭 | 기존 제약조건을 삭제함. |
-- Course 테이블에 instructor 컬럼 추가
ALTER TABLE Course ADD (instructor VARCHAR2(50));
-- Course 테이블의 course_name 컬럼 크기를 200으로 변경
ALTER TABLE Course MODIFY (course_name VARCHAR2(200));
-- Course 테이블의 instructor 컬럼 삭제
ALTER TABLE Course DROP COLUMN instructor;
DROP TABLE - 테이블 삭제테이블의 구조와 데이터를 완전히 삭제함. 되돌릴 수 없으므로 사용에 매우 신중해야 함.
DROP TABLE Course;
CASCADE CONSTRAINTS: 삭제하려는 테이블을 다른 테이블이 FOREIGN KEY로 참조하고 있을 경우, 해당 참조 제약조건까지 함께 삭제하면서 테이블을 강제로 삭제하는 옵션.DELETE, TRUNCATE, DROP)데이터를 삭제하는 세 명령어는 동작 방식과 범위, 복구 가능 여부에서 큰 차이를 보이며, 이는 SQLD 시험의 단골 출제 주제임.
| 구분 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 종류 | DML (데이터 조작어) | DDL (데이터 정의어) | DDL (데이터 정의어) |
| 대상 | 데이터 (행 단위) | 모든 데이터 (공간 초기화) | 테이블 구조 + 모든 데이터 |
WHERE 절 | 가능 (조건부 삭제) | 불가능 | 불가능 |
ROLLBACK | 가능 (커밋 이전) | 불가능 (즉시 반영) | 불가능 (즉시 반영) |
| 속도 | 느림 | 매우 빠름 | 빠름 |
| 참조 무결성 | FK 제약조건에 따라 삭제 불가 | FK 제약조건이 있으면 동작 불가 | FK 제약조건이 있으면 동작 불가 (단, CASCADE 옵션으로 강제 가능) |
CREATE INDEX - 인덱스 생성SELECT 문의 검색 속도를 향상시키기 위해 데이터의 '찾아보기'를 생성함.
PRIMARY KEY 또는 UNIQUE 제약조건을 생성하면, 해당 컬럼에 대해 자동으로 고유 인덱스(Unique Index)가 생성됨.WHERE 절이나 JOIN 조건에 자주 사용되는 컬럼에 인덱스를 생성하면 성능 향상에 도움이 됨.INSERT, UPDATE, DELETE 시 인덱스도 함께 수정해야 하므로 DML 성능은 저하될 수 있음.-- Course 테이블의 course_name 컬럼에 인덱스 생성
CREATE INDEX idx_course_name ON Course(course_name);
네, 알겠습니다. DDL 관련 내용에 대해 SQLD 시험에서 자주 출제되는 문제 유형과 함정 포인트를 기존 정리 내용에 추가하여 보완해 드리겠습니다.
DDL 파트는 각 명령어의 정확한 문법과 옵션을 묻는 문제, 그리고 DML과의 차이점을 비교하는 문제가 핵심적으로 출제됩니다.
CREATE TABLE 관련PRIMARY KEY를 여러 컬럼에 지정하거나, NOT NULL 제약조건에 이름을 부여하려는 등 잘못된 제약조건 문법을 찾는 문제가 출제됩니다.※ 함정:
CONSTRAINT nn_name NOT NULL (name)과 같이NOT NULL은 컬럼 레벨에서만 정의할 수 있는데, 이를 테이블 레벨 정의처럼 표현한 쿼리는 오류입니다.
VARCHAR2(10)에 '대한민국 KOREA' (한글 4자 * 2~3바이트 + 영문 5자 = 13~17바이트) 와 같이 지정된 크기를 초과하는 데이터를 INSERT 할 수 있는지 묻는 문제가 나옵니다. (결과: 오류 발생)ON DELETE CASCADE와 ON DELETE SET NULL의 동작 결과를 묻는 문제가 단골로 출제됩니다. 부모 테이블의 데이터가 삭제될 때 자식 테이블의 데이터가 어떻게 변하는지 정확히 알아야 합니다.※ 함정:
ON DELETE SET NULL옵션은 자식 테이블의 FK 컬럼에NOT NULL제약조건이 걸려 있으면 설정 자체가 불가능합니다. 이 점을 이용한 문제가 나올 수 있습니다.
ALTER TABLE 관련MODIFY의 제약사항: 이미 데이터가 있는 컬럼의 크기를 줄일 때, 저장된 데이터의 최대 길이보다 작게 줄일 수 없다는 점을 이용한 문제가 출제됩니다. (예: 'SQLD'가 저장된 VARCHAR2(10) 컬럼을 VARCHAR2(3)으로 MODIFY 시도 시 오류 발생)ADD/MODIFY와 DEFAULT: DEFAULT 값과 함께 새로운 컬럼을 ADD하면, 기존의 모든 행에 해당 DEFAULT 값이 채워집니다. 이 동작을 이해하고 있는지 묻는 문제가 나올 수 있습니다.DROP, TRUNCATE, DELETE 비교 (매우 중요)이 세 명령어의 차이점을 비교하는 표는 반드시 암기해야 합니다.
DELETE는 DML이고 나머지는 DDL이라는 점, 이로 인해 ROLLBACK 가능 여부가 갈린다는 점이 가장 중요한 포인트입니다.WHERE 절 사용 가능 여부: DELETE만 WHERE 절을 사용할 수 있다는 점을 이용해, 특정 조건의 데이터만 삭제할 때 어떤 명령어를 써야 하는지 묻습니다.DELETE는 로그를 기록하여 느리고, TRUNCATE는 공간을 초기화하여 매우 빠르다는 개념을 알아야 합니다.RENAME 관련ALTER TABLE ... RENAME COLUMN ... 과 RENAME ... TO ... 의 차이점을 알아야 합니다. 전자는 컬럼 이름 변경, 후자는 테이블 이름 변경입니다.INDEX 관련PRIMARY KEY나 UNIQUE 제약조건을 설정하면 자동으로 인덱스가 생성된다는 사실을 묻는 문제가 출제됩니다.SELECT 성능은 향상시키지만, INSERT, UPDATE, DELETE와 같은 DML 작업 시에는 인덱스도 함께 변경해야 하므로 오히려 성능 저하를 유발할 수 있다는 점을 이해해야 합니다.