SQL 정의·조작·제어 — DDL · DML · DCL · 제약 E09

표를 만들고, 행을 넣고 고치고 지우고, 권한을 주는 문장이다. 결과를 세는 장이 아니라 문장을 정확히 적는 장이다

왜 이 장을 하나
이 묶음의 문제는 두 꼴뿐이다 — 문장을 통째로 쓰거나, 문장의 빈칸에 키워드를 넣거나. 둘 다 정답표와 글자 단위로 대조되므로 키워드 하나, 따옴표 하나, 세미콜론 하나가 5점이다.
다루는 것CREATE · INSERT · UPDATE · DELETE · GRANT · 제약 · 뷰 · 인덱스
문항기출 6 · 예상 2 · 훈련 5
끝나면문장 6종을 안 보고 적는다

01왜 이 장인가

왜 이걸 하나 — 조회보다 적게 나오지만 외우면 확실한 5점이다. 계산도 함정도 없다.

11회분 220문항 중 이 장의 기출은 6문항이다. DELETE 작성(2023-1회), INSERT 작성과 DROP 옵션(2023-2회), INSERT · SELECT · UPDATE 빈칸(2024-2회), 외래키 제약 빈칸(2026-1회), CHECK 제약(2026-2회). 회차로 보면 11회 중 5회에 나왔고, 2026년에는 두 회 연속으로 제약 조건이 나왔다.

몇 문항무엇을 적나보기
문장 작성2DELETE · INSERT 한 문장 전부2023-1회 13번 · 2023-2회 1번
키워드 빈칸3VALUES · SET · CONSTRAINT · FOREIGN · REFERENCES · CHECK2024-2회 3번 · 2026-1회 18번 · 2026-2회 19번
옵션 용어1CASCADE2023-2회 2번

→ 여섯 문항의 정답에 나온 키워드를 다 모아도 12개다. VALUES · SELECT · FROM · SET · DELETE · INSERT · CONSTRAINT · FOREIGN · KEY · REFERENCES · CHECK · CASCADE. 이 장은 그 12개에 아직 안 나온 짝(GRANT · REVOKE · ALTER · CREATE VIEW · INDEX · COMMIT · ROLLBACK)을 더해 한 벌로 만든다.

2회에서 SQL 이 약했다면 이 장은 가장 빨리 메워지는 자리다. 문장의 꼴이 정해져 있어 여섯 문장을 백지에 적을 수 있으면 끝나고, 03절이 그 여섯을 한 줄씩 세운다.

문항 수는 이 노트의 문제 데이터에서 ch=E09 인 것을 센 값이다(2026-09-14). 2026-1회 18번의 제약 이름과 참조 열은 복원본마다 달라 그랜드라이프 복원(TEAM_TF · TEAM_ID2)을 따랐다.

02한눈에

왜 이걸 하나 — 시험 전날 이 절의 문장 6개를 백지에 적어 본다.

세 갈래DDL 정의 — CREATE · ALTER · DROP · TRUNCATE. DML 조작 — SELECT · INSERT · UPDATE · DELETE. DCL 제어 — GRANT · REVOKE. TCL(트랜잭션) — COMMIT · ROLLBACK · SAVEPOINT 는 DCL 에 넣는 책도 있다.
INSERTINSERT INTO 표(열1, 열2) VALUES (값1, 값2); 열 목록을 빼면 표의 열 순서대로 전부 준다. 문자열은 작은따옴표, 숫자는 그대로.
UPDATEUPDATE 표 SET 열 = 값 WHERE 조건; SET 이 키워드다. INTO 나 FROM 을 쓰면 틀린다. WHERE 를 빼면 전부 바뀐다.
DELETEDELETE FROM 표 WHERE 조건; 열 이름을 적지 않는다. WHERE 를 빼면 전부 지워지고 표는 남는다.
CREATE TABLECREATE TABLE 표 (열 자료형 [NOT NULL | PRIMARY KEY | UNIQUE | CHECK(조건) | DEFAULT 값], …, FOREIGN KEY (열) REFERENCES 부모표(열)); 제약에 이름을 붙이려면 앞에 CONSTRAINT 이름.
ALTER · DROPALTER TABLE 표 ADD 열 자료형; · ALTER TABLE 표 DROP COLUMN 열; · DROP TABLE 표; · DROP VIEW 뷰 CASCADE;(의존 객체까지) · RESTRICT(의존 객체 있으면 거부).
뷰 · 인덱스 · 도메인CREATE VIEW 뷰 AS SELECT …; · CREATE INDEX 이름 ON 표(열); · CREATE DOMAIN 이름 AS 자료형 CHECK(VALUE IN (…));
GRANT · REVOKEGRANT SELECT ON 표 TO 사용자 [WITH GRANT OPTION]; · REVOKE SELECT ON 표 FROM 사용자; TO 와 FROM 이 짝이다. GRANT ALL, TO PUBLIC 도 있다.
COMMIT · ROLLBACKCOMMIT 은 확정, ROLLBACK 은 마지막 COMMIT 이후를 취소. SAVEPOINT 이름 뒤에 ROLLBACK TO 이름 으로 부분 취소.

03밑바닥

왜 이걸 하나 — 키워드를 외우는 게 아니라 왜 그 자리에 그 말이 오는지를 알면 빈칸이 어디 뚫려도 채운다.

3-1. 문장은 「동사 + 대상 + 세부」다

SQL 문장은 전부 같은 뼈대다. 맨 앞에 동사(무엇을 하나), 그 다음에 대상(어느 표), 마지막에 세부(어느 행 · 어떤 값)가 온다. 동사마다 대상을 받는 전치사가 정해져 있다는 것이 빈칸 문제의 전부다.

동사대상을 받는 말세부를 받는 말문장
INSERTINTO 표VALUES (값)INSERT INTO 학생 VALUES (…);
UPDATE표 (전치사 없음)SET 열 = 값 · WHEREUPDATE 학생 SET 학년 = 4 WHERE …;
DELETEFROM 표WHEREDELETE FROM 학생 WHERE …;
SELECT열 … FROM 표WHERE · GROUP BY · ORDER BYSELECT 이름 FROM 학생;
GRANT권한 ON 표TO 사용자GRANT SELECT ON 학생 TO 김기사;
REVOKE권한 ON 표FROM 사용자REVOKE SELECT ON 학생 FROM 김기사;
CREATE · DROP · ALTERTABLE · VIEW · INDEX · DOMAIN 이름괄호 안 정의 · ADD · CASCADEDROP VIEW 성적요약 CASCADE;

→ 2024년 2회 3번의 빈칸 넷(VALUES · SELECT · FROM · SET)은 전부 이 표의 둘째 · 셋째 칸이다. INSERT 는 INTO 와 VALUES, UPDATE 는 SET, DELETE 는 FROM — 동사가 정해지면 나머지 칸이 정해진다.

3-2. 제약 조건은 「무엇을 막나」로 구분한다

CREATE TABLE 안의 제약은 다섯이고, 각각 막는 것이 다르다. PRIMARY KEY 는 중복과 NULL 을, UNIQUE 는 중복을, NOT NULL 은 NULL 을, CHECK 는 조건 밖의 값을, FOREIGN KEY 는 부모 표에 없는 값을 막는다. 문제가 「값의 범위」「조건」을 말하면 CHECK, 「다른 표를 참조」를 말하면 FOREIGN KEY 다.

외래키 한 줄은 여섯 토막이 정해진 순서로 온다. CONSTRAINT 이름 FOREIGN KEY (내 열) REFERENCES 부모표 (부모 열). 2026년 1회 18번은 이 여섯 토막 중 다섯을 빈칸으로 뚫었다. 괄호 두 개 중 앞은 자식, 뒤는 부모다.

CHECK 는 열 정의에 붙을 수도 있고 도메인에 붙을 수도 있다. 2026년 2회 19번의 CREATE DOMAIN SEASON AS VARCHAR(6) CHECK (VALUE IN (…)) 에서 VALUE 는 그 도메인에 들어올 값을 가리키는 예약어다. 훈련 1번은 같은 CHECK 를 열에 붙인 꼴이라 급여 INT CHECK (급여 >= 0) 처럼 열 이름을 쓴다.

3-3. 지우는 말 셋과 되돌리는 말 둘

지우는 말은 셋이다. DELETE 는 행을 지우고 표는 남기며, TRUNCATE 는 행 전부를 비우되 되돌릴 수 없는 DDL 이고, DROP 은 표 자체를 없앤다. 「어느 행」이 있으면 DELETE, 「표를」이면 DROP 이다.

DROP 뒤의 CASCADE 와 RESTRICT 는 의존하는 객체가 있을 때의 태도다. CASCADE 는 뷰 · 제약처럼 그 표에 매달린 것까지 같이 지우고, RESTRICT 는 매달린 것이 있으면 지우기를 거부한다. 2023년 2회 2번이 「연쇄적으로 함께 제거」라고 했으니 CASCADE 다.

되돌리는 말은 COMMIT 과 ROLLBACK 이다. ROLLBACK 은 마지막 COMMIT 이후만 취소하므로, 훈련 5번처럼 COMMIT 을 사이에 두면 그 앞의 INSERT 는 살아남는다. GRANT 로 준 권한을 거두는 것은 ROLLBACK 이 아니라 REVOKE 다.

통과 기준은 셋이다. 첫째, 02절의 문장 8종을 안 보고 적는다. 둘째, 제약 5개가 각각 무엇을 막는지 말한다. 셋째, 외래키 한 줄의 여섯 토막을 순서대로 적는다. 빈칸 문제는 이 세 가지 밖에서 나오지 않는다.
UPDATE 도 표를 고치는 것이니 UPDATE 표 SET … FROM 처럼 FROM 이 온다.UPDATE 뒤에는 표 이름이 바로 오고, 세부는 SET 뿐이다. UPDATE 에 INTO 나 FROM 을 넣은 답은 통째로 오답이다. DELETE 만 FROM 을 받는다.
GRANT 의 반대는 DENY 다.표준 SQL 에서 권한을 거두는 말은 REVOKE 이고, TO 가 FROM 으로 바뀐다. DENY 는 특정 제품에만 있다. 시험 답안은 REVOKE 다.

04기출

왜 이걸 하나 — 문장을 끝까지 적는 연습이다. 세미콜론과 따옴표까지 답 칸에 적는다.

작성 문제는 답 칸에 문장을 끝까지 쓴 뒤 정답을 연다. 키워드 · 따옴표 · 괄호 · 세미콜론 중 하나라도 다르면 틀렸다를 누른다. 시험장 채점이 그렇다.

2023-1회 · 13번SQL

학생 테이블에서 이름이 '민수'인 튜플을 삭제하는 SQL문을 작성하시오. (구문 끝에 세미콜론 포함)

정답DELETE FROM 학생 WHERE 이름 = '민수';
DELETE는 FROM과 세트, 문자열은 작은따옴표. WHERE를 빼먹으면 전체 삭제가 되므로 실전에서도 감점. DELETE 구문은 3년간 2회 이상 출제된 필수 암기 문법.
2023-2회 · 1번SQL

학생 테이블(학번, 이름, 학년, 과목, 전화번호)에 학번 98170823, 이름 '한국산', 3학년, '경영학개론', '050-1234-1234'인 학생을 삽입하는 SQL을 작성하시오.

정답INSERT INTO 학생 VALUES(98170823, '한국산', 3, '경영학개론', '050-1234-1234');
모든 컬럼에 순서대로 넣을 때는 컬럼 목록 생략 가능. 문자열은 작은따옴표, 숫자는 따옴표 없음. 2017년 1회 문제의 재출제 — 기출 재활용의 대표 사례!
2023-2회 · 2번SQL

뷰(VIEW)를 제거할 때, 그 뷰를 참조하는 다른 뷰나 제약조건까지 연쇄적으로 함께 제거하는 DROP 옵션은?

정답CASCADE
"폭포(cascade)처럼 위에서 아래로 줄줄이 쓸려 내려간다". 반대로 참조가 있으면 삭제를 거부하는 옵션은 RESTRICT.
2024-2회 · 3번SQL

다음 SQL문의 괄호 ①부터 ④에 들어갈 키워드를 순서대로 쓰시오.

INSERT INTO member(id, name) ① (10, 'Mina'); ② name ③ member WHERE id = 10; UPDATE member ④ name = 'Jin' WHERE id = 10;
정답① VALUES ② SELECT ③ FROM ④ SET
세 문장이 각각 넣기 · 읽기 · 고치기다. INSERT INTO 테이블(열) 다음에 값을 주는 말은 VALUES, 읽을 때는 SELECT 열 FROM 테이블, 고칠 때는 UPDATE 테이블 SET 열 = 값. 네 칸 전부 키워드라 대문자로 적는다. sqlite 로 세 문장을 순서대로 실행해 Jin 이 조회되는 것을 확인했다. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-1회 · 18번SQL

다음 조건을 만족하도록 PLAYER 테이블의 외래키 제약 조건을 완성하시오.

외래키 제약 조건의 이름은 TEAM_TF이다.
PLAYER 테이블의 TEAM_ID가 외래키다.
TEAM 테이블의 TEAM_ID2를 참조한다.

CREATE TABLE PLAYER ( PLAYER_ID CHAR(7) NOT NULL, PLAYER_NAME VARCHAR2(20) NOT NULL, TEAM_ID CHAR(3) NOT NULL, PRIMARY KEY (PLAYER_ID), ① TEAM_TF ② KEY (③) ④ TEAM (⑤) );
정답① CONSTRAINT ② FOREIGN ③ TEAM_ID ④ REFERENCES ⑤ TEAM_ID2
외래키 한 줄의 꼴은 고정이다 — CONSTRAINT 이름 FOREIGN KEY (내 열) REFERENCES 부모테이블 (부모 열). 제약 이름이 앞에 오고, 괄호 두 개는 자식 열 · 부모 열 순서다. 이전 자료의 복원은 이름이 FK_TEAM, 참조 열이 TEAM_ID 였는데 여기서는 그랜드라이프 복원을 따랐다 — 어느 쪽이든 키워드 ①②④ 는 같다. sqlite 로 같은 꼴(VARCHAR2 는 VARCHAR 로)을 만들어 문법을 확인했다. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-2회 · 19번SQL

다음 SQL문의 빈칸 ①에 들어갈 키워드를 쓰시오.

CREATE DOMAIN SEASON AS VARCHAR(6) ① (VALUE IN ('spring', 'summer', 'autumn', 'winter'));
정답CHECK
도메인이나 컬럼에 들어갈 값의 조건을 다는 제약이 CHECK 다. 짝으로 외우는 제약 4개는 PRIMARY KEY · FOREIGN KEY · UNIQUE · CHECK 이고, 값의 범위를 제한하는 것은 CHECK 뿐이다. 대문자로 적는다. 복원 출처는 grandlife.co.kr 2026-2회 복원 풀이(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·수치가 실제와 다를 수 있다.
예상 1회 · 11번SQL빈출 원리: DCL 구문

사용자 '김기사'에게 학생 테이블의 SELECT 권한을 부여하되, 김기사가 그 권한을 다른 사용자에게도 부여할 수 있도록 하는 SQL문을 작성하시오.

정답GRANT SELECT ON 학생 TO 김기사 WITH GRANT OPTION;
"재위임 가능" = WITH GRANT OPTION. 회수는 REVOKE SELECT ON 학생 FROM 김기사; (연쇄 회수는 CASCADE). GRANT는 TO, REVOKE는 FROM — 짝이 바뀌면 오답.
예상 2회 · 11번SQL빈출 원리: UPDATE 구문

학생 테이블에서 이름이 '홍길동'인 학생의 학년을 4로 변경하는 SQL문을 작성하시오.

정답UPDATE 학생 SET 학년 = 4 WHERE 이름 = '홍길동';
UPDATE—SET 짝 필수 (INTO나 FROM을 쓰면 오답). 문자열만 작은따옴표, 숫자는 그대로. DELETE(2023 1회)·INSERT(2023 2회)가 나왔으니 UPDATE 작성이 유력한 다음 타자입니다.

05틀리는 자리

왜 이걸 하나 — 문장 문제는 아는데 깎이는 자리가 정해져 있다.

자리새는 꼴적는 법기출
전치사UPDATE … FROM, DELETE … INTO, GRANT … FROMINSERT INTO · DELETE FROM · UPDATE 표 SET · GRANT TO · REVOKE FROM2024-2회 3번 · 예상 2회 11번
따옴표문자열을 큰따옴표로, 숫자를 따옴표로문자열만 작은따옴표. 숫자는 그대로2023-2회 1번 · 2023-1회 13번
세미콜론문장 끝을 비운다문제가 「세미콜론 포함」이라 하면 반드시, 아니어도 붙이는 쪽이 안전2023-1회 13번
열 목록과 값 순서INSERT 의 값 순서를 표 순서와 다르게열 목록을 적었으면 그 순서로, 안 적었으면 표의 열 순서로2023-2회 1번
키워드 짝FOREIGN 만 쓰고 KEY 를 빼거나, REFERENCES 를 REFERENCE 로FOREIGN KEY · PRIMARY KEY 는 두 낱말, REFERENCES 는 s 까지2026-1회 18번
괄호 안팎외래키의 자식 열과 부모 열을 바꾼다앞 괄호 = 내 열, 뒤 괄호 = 부모 열2026-1회 18번
옵션 낱말CASCADE 를 CASCADING 으로, WITH GRANT OPTION 을 빼먹는다문제가 「다른 사용자에게도 부여」라고 하면 WITH GRANT OPTION 까지2023-2회 2번 · 예상 1회 11번

작성 문제는 한 문장이 곧 답이라 부분 점수가 없다고 보고 쓴다. 빈칸 문제는 칸마다 점수가 갈리므로 모르는 칸도 비우지 않는다.

06훈련

왜 이걸 하나 — 기출에 아직 안 나온 짝을 미리 풀어 둔다. 제약 다섯 · REVOKE · ALTER · COMMIT 이다.

5문항은 02절 카드의 문장 중 기출에 없던 것들이다. 정답은 전부 sqlite 로 실행해 확인했고, GRANT · REVOKE 만 sqlite 에 없어 표준 문법으로 대조했다.

훈련 SQL정의 · 1번SQL

다음 SQL문의 괄호 ①부터 ④에 들어갈 키워드를 순서대로 쓰시오. 사번은 기본키, 부서코드는 부서 테이블의 부서코드를 참조하며, 급여는 0 이상이어야 한다.

CREATE TABLE 사원 ( 사번 INT ① ②, 이름 VARCHAR(20) NOT NULL, 부서코드 CHAR(3), 급여 INT ③ (급여 >= 0), FOREIGN KEY (부서코드) ④ 부서(부서코드) );
정답① PRIMARY ② KEY ③ CHECK ④ REFERENCES
열 뒤에 바로 붙는 제약은 PRIMARY KEY · NOT NULL · UNIQUE · CHECK(조건) 이고, 다른 표를 가리키는 것은 FOREIGN KEY (열) REFERENCES 표(열) 이다. 값의 범위를 제한하는 말은 CHECK 하나뿐이다(2026년 2회 19번의 CREATE DOMAIN 도 같다). sqlite 로 이 문장을 만들어 급여 -1 을 넣으면 CHECK constraint failed 가 나는 것을 확인했다.
훈련 SQL정의 · 2번SQL

학생 테이블에서 학년이 4인 학생을 모두 삭제하는 SQL문과, 학생 테이블 자체를 삭제하는 SQL문을 각각 쓰시오.

정답DELETE FROM 학생 WHERE 학년 = 4;
DROP TABLE 학생;
행을 지우는 것은 DELETE(DML), 표를 지우는 것은 DROP(DDL) 이다. DELETE 에 WHERE 를 빼면 행이 전부 지워지지만 표는 남고, DROP 은 표와 구조까지 없앤다. TRUNCATE 는 행 전부를 빠르게 비우는 DDL 이다. sqlite 로 DELETE 뒤 SELECT 가 0행, DROP 뒤 SELECT 가 no such table 이 되는 것을 확인했다.
훈련 SQL정의 · 3번SQL

사용자 김기사에게 부여했던 학생 테이블의 SELECT 권한을 회수하는 SQL문을 쓰시오.

정답REVOKE SELECT ON 학생 FROM 김기사;
GRANT 권한 ON 표 TO 사용자 의 짝은 REVOKE 권한 ON 표 FROM 사용자 다. TO 와 FROM 이 바뀌는 것이 감점 자리다. 권한을 물려줄 수 있게 준 것을 회수할 때는 REVOKE … FROM 김기사 CASCADE 처럼 뒤에 옵션이 붙는다. sqlite 에는 GRANT 가 없어 표준 SQL 문법으로 대조했다.
훈련 SQL정의 · 4번SQL

다음 SQL문의 괄호 ①과 ②에 들어갈 키워드를 쓰시오. 학생 테이블에 이메일 열을 추가하고, 이름 열에 대해 인덱스 idx_name 을 만든다.

ALTER TABLE 학생 ① 이메일 VARCHAR(50); ② INDEX idx_name ON 학생(이름);
정답① ADD ② CREATE
표의 구조를 고치는 것은 ALTER TABLE 이고, 열을 더할 때 ADD, 지울 때 DROP COLUMN, 바꿀 때 MODIFY(또는 ALTER COLUMN) 다. 인덱스 · 뷰 · 테이블은 전부 CREATE 로 만든다. sqlite 로 두 문장을 실행해 열이 추가되고 인덱스가 생기는 것을 확인했다.
훈련 SQL정의 · 5번SQL

다음 문장을 순서대로 실행한 뒤 학생 테이블의 행 수를 쓰시오. 처음 학생 테이블에는 3행이 있다.

INSERT INTO 학생 VALUES (4, '홍길동', 1); COMMIT; DELETE FROM 학생 WHERE 학번 = 4; DELETE FROM 학생 WHERE 학번 = 1; ROLLBACK;
정답4
COMMIT 은 그때까지의 변경을 확정하고, ROLLBACK 은 마지막 COMMIT 이후의 변경만 되돌린다. INSERT 는 COMMIT 으로 굳어 4행이 됐고, 그 뒤 DELETE 두 개는 ROLLBACK 으로 취소된다. 그래서 4. sqlite 로 BEGIN 을 걸고 같은 순서로 돌려 4행을 확인했다.

07백지 재현

왜 이걸 하나 — 아래를 안 보고 적을 수 있어야 문장 문제가 끝난다.