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 FROM 테이블 WHERE 조건 이다. DELETE 뒤에 열 이름을 적지 않는다 — 행 전체가 지워지므로 "무엇을"이 아니라 "어느 테이블에서 · 어느 행을"만 말한다. WHERE 를 빼면 테이블의 모든 행이 지워지므로 조건이 답의 핵심이다. 문자열 값은 작은따옴표로 감싼다.

따라가기

  1. 어느 테이블 → DELETE FROM 학생
  2. 어느 행 → WHERE 이름 = '민수'
  3. 끝에 세미콜론(문제가 포함하라고 했다)

헷갈리는 자리DELETE * FROM 학생 처럼 * 를 넣는 것(SELECT 와 섞임 — 오류). DROP TABLE 은 테이블 자체를 없애는 것이라 다른 명령이다. 따옴표를 큰따옴표로 쓰거나 빼는 것도 감점 자리다. DELETE 는 DML 이라 COMMIT 전에는 ROLLBACK 으로 되돌릴 수 있지만, 같은 결과를 내는 TRUNCATE 나 DROP 은 되돌릴 수 없다 — 이 차이도 같은 묶음에서 자주 나온다.

답의 SQL 을 sqlite 3.49 에서 실행해 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 열 이름이 실제와 다를 수 있다.

2023-2회 · 1번SQL

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

정답INSERT INTO 학생 VALUES(98170823, '한국산', 3, '경영학개론', '050-1234-1234');

INSERT INTO 학생 VALUES(98170823, '한국산', 3, '경영학개론', '050-1234-1234');

원리 — 행을 넣는 명령은 INSERT INTO 테이블 VALUES(값들) 이다. 열 이름을 생략하면 값을 테이블의 열 순서(학번, 이름, 학년, 과목, 전화번호)대로 전부 적어야 한다. 숫자는 그대로, 문자열은 작은따옴표로 감싼다. 전화번호는 숫자처럼 보여도 하이픈이 있어 문자열이다. 열을 골라 넣으려면 INSERT INTO 학생(학번, 이름) VALUES(…) 처럼 열 목록을 적는다.

따라가기

  1. INSERT INTO 학생
  2. VALUES(98170823, '한국산', 3, '경영학개론', '050-1234-1234')
  3. 값 다섯 개가 열 다섯 개와 순서 · 개수가 맞는다

헷갈리는 자리 — 학년 3 을 '3' 으로 감싸는 것(틀리진 않지만 숫자 열은 숫자로), 전화번호의 따옴표를 빼는 것(오류). 값 순서를 바꾸면 열과 어긋난다. VALUES 를 VALUE 로 적는 것도 오류다.

답의 SQL 을 sqlite 3.49 에서 실행해 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 열 이름이 실제와 다를 수 있다.

2023-2회 · 2번SQL

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

정답CASCADE

— CASCADE. 뷰를 지울 때 그것에 기대고 있는 다른 뷰 · 제약까지 함께 지우는 옵션이다.

원리 — 뷰는 다른 테이블이나 뷰 위에 세운 창이다. 어떤 뷰 위에 또 다른 뷰가 서 있을 때 아래 것을 지우면 위 것이 허공에 뜬다. DROP VIEW 이름 CASCADE 는 "위에 기댄 것까지 연쇄로 지워라", RESTRICT 는 "기댄 것이 있으면 지우지 말고 막아라"다. 같은 짝이 DROP TABLE 에도 있다. cascade 는 폭포처럼 아래로 번진다는 뜻이다.

따라가기

  1. 지우려는 뷰를 참조하는 뷰 · 제약이 있다
  2. 함께 지우려면 → CASCADE
  3. 막으려면 → RESTRICT

헷갈리는 자리 — RESTRICT 와 반대로 적는 것. "연쇄 · 함께" 가 나오면 CASCADE, "막는다 · 거부" 가 나오면 RESTRICT 다. 외래키의 ON DELETE CASCADE 도 같은 낱말이라 문맥이 뷰인지 외래키인지 본다. 옵션을 아예 안 적으면 DBMS 마다 기본값이 달라(대개 RESTRICT), 시험 답으로는 문제가 묻는 낱말 하나만 적는다.

SQL 표준 · 교재 정의와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

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

— ① VALUES ② SELECT ③ FROM ④ SET. 넣기 · 읽기 · 고치기 세 문장의 자리를 채우는 것이다.

원리 — INSERT 는 INSERT INTO 테이블(열) VALUES(값), 읽기는 SELECT 열 FROM 테이블 WHERE …, 고치기는 UPDATE 테이블 SET 열 = 값 WHERE … 꼴이다. 세 문장의 예약어 자리는 정해져 있어서 앞뒤 낱말만 보면 채워진다: INTO 뒤에 괄호 값이 오면 그 앞은 VALUES, 열 이름 앞이 문장 시작이면 SELECT, 테이블 이름 앞은 FROM, UPDATE 뒤에서 열 = 값 앞은 SET 이다.

따라가기

  1. INSERT INTO member(id, name) VALUES (10, 'Mina')
  2. SELECT name FROM member WHERE id = 10
  3. UPDATE member SET name = 'Jin' WHERE id = 10

헷갈리는 자리 — ④ 에 VALUES 를 적는 것. UPDATE 는 SET 이다. ① 에 VALUE(단수)를 적는 것 — 표준은 VALUES 다. 네 칸을 순서대로 적어야 하며 하나라도 자리가 바뀌면 그 칸은 0 점이다.

답의 SQL 을 sqlite 3.49 에서 실행해 확인했다. 복원 출처 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 ③ TEAM_ID ④ REFERENCES ⑤ TEAM_ID2. 이름 붙은 외래키 제약을 적는 정해진 꼴이다.

원리 — 외래키는 "이 열의 값은 저 테이블의 저 열에 있는 값이어야 한다"는 약속이다. 테이블을 만들 때 적는 꼴은 CONSTRAINT 제약이름 FOREIGN KEY (내 열) REFERENCES 상대테이블(상대 열) 이다. CONSTRAINT 이름은 나중에 지울 때(ALTER TABLE … DROP CONSTRAINT 이름) 부르기 위해 붙인다. 문제가 준 조건 셋 — 이름 TEAM_TF, 내 열 TEAM_ID, 상대 TEAM 의 TEAM_ID2 — 을 그 자리에 넣으면 된다.

따라가기

  1. 제약 이름을 붙이는 낱말 → CONSTRAINT TEAM_TF
  2. 외래키 선언 → FOREIGN KEY (TEAM_ID)
  3. 참조 대상 → REFERENCES TEAM (TEAM_ID2)

헷갈리는 자리 — ⑤ 에 TEAM_ID 를 적는 것. 상대 테이블의 열 이름은 TEAM_ID2 라고 문제가 못 박았다. ④ 에 REFERENCE(단수)를 적는 것 — REFERENCES 다. PRIMARY KEY 처럼 FOREIGN KEY 도 두 낱말이라 ② 는 FOREIGN 하나다.

답의 SQL 을 sqlite 3.49 에서 실행해 확인했다. 복원 출처 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. 값이 정해진 범위 · 목록 안에 있는지 검사하는 제약이다.

원리CREATE DOMAIN 은 "이 이름의 자료형은 VARCHAR(6) 이되 값은 이 네 가지만 된다"처럼 자료형에 규칙을 붙여 이름을 만드는 문장이다. 값의 범위를 제한하는 제약이 CHECK (조건) 이고, 도메인 안에서는 열 이름 대신 VALUE 라는 낱말로 그 값을 가리킨다. 테이블의 열에 붙일 때는 급여 INT CHECK (급여 >= 0) 처럼 열 이름을 쓴다. NOT NULL · UNIQUE · DEFAULT 와 함께 열 제약의 네 식구다.

따라가기

  1. VALUE IN ('spring', …) — 값을 네 개로 제한하는 조건
  2. 조건을 거는 제약 낱말 → CHECK

헷갈리는 자리 — IN 이 보인다고 WHERE 나 CONSTRAINT 를 적는 것. 조건이 붙는 제약은 CHECK 이고, CONSTRAINT 는 제약에 이름을 붙이는 낱말이라 자리가 다르다. DEFAULT 는 값을 안 넣었을 때의 기본값이라 뜻이 다르다.

SQL 표준 · 교재 정의와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

예상 1회 · 11번SQL빈출 원리: DCL 구문

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

정답GRANT SELECT ON 학생 TO 김기사 WITH GRANT OPTION;

GRANT SELECT ON 학생 TO 김기사 WITH GRANT OPTION;

원리 — 권한을 주는 명령은 GRANT 권한 ON 대상 TO 사용자 다(DCL). 여기에 WITH GRANT OPTION 을 붙이면 받은 사람이 그 권한을 남에게 다시 줄 수 있다. 거두는 명령은 REVOKE 권한 ON 대상 FROM 사용자 이고, 남에게 넘겨준 권한까지 같이 거두려면 CASCADE 를 붙인다. GRANT 는 TO, REVOKE 는 FROM 이라는 짝을 기억한다.

따라가기

  1. 무슨 권한 → SELECT, 무엇에 → ON 학생
  2. 누구에게 → TO 김기사
  3. 다시 줄 수 있게 → WITH GRANT OPTION

헷갈리는 자리 — TO 를 FOR 나 FROM 으로 적는 것. WITH GRANT OPTION 을 빼면 "권한 부여"까지만 맞고 문제의 둘째 조건이 빠진다. 낱말 순서(권한 → ON → TO → WITH)가 곧 채점 기준이다.

이전 자료의 예상 문제다. sqlite 3.49 에서 실행해 정답을 확인했다.

예상 2회 · 11번SQL빈출 원리: UPDATE 구문

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

정답UPDATE 학생 SET 학년 = 4 WHERE 이름 = '홍길동';

UPDATE 학생 SET 학년 = 4 WHERE 이름 = '홍길동';

원리 — 값을 고치는 명령은 UPDATE 테이블 SET 열 = 새값 WHERE 조건 이다. SET 뒤에 고칠 열과 값을 적고, WHERE 로 고칠 행을 고른다. WHERE 를 빼면 모든 행의 학년이 4 가 되므로 조건이 반드시 있어야 한다. 여러 열을 한 번에 고치려면 SET 학년 = 4, 학과 = '…' 처럼 쉼표로 잇는다.

따라가기

  1. 어느 테이블 → UPDATE 학생
  2. 무엇을 어떻게 → SET 학년 = 4
  3. 어느 행 → WHERE 이름 = '홍길동'

헷갈리는 자리 — INSERT 처럼 VALUES 를 쓰거나, SET 대신 = 만 적는 것. 4 는 숫자라 따옴표가 없고 홍길동은 문자열이라 있다. 이 셋(SET · WHERE · 따옴표)이 UPDATE 작성 문제의 감점 자리다.

이전 자료의 예상 문제다. sqlite 3.49 에서 실행해 정답을 확인했다.

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 ③ CHECK ④ REFERENCES. 기본키 · 값 범위 · 외래키 참조를 적는 세 예약어다.

원리 — 열 뒤에 바로 PRIMARY KEY 를 붙이면 그 열이 기본키다. CHECK (조건) 은 그 열의 값이 조건을 만족해야 한다는 제약이다. FOREIGN KEY (열) REFERENCES 상대(열) 은 외래키다. CREATE TABLE 안의 제약은 이 셋에 NOT NULL · UNIQUE · DEFAULT 를 더한 여섯이 전부라 낱말과 자리를 짝으로 외운다.

따라가기

  1. 사번 INT PRIMARY KEY
  2. 급여 INT CHECK (급여 >= 0)
  3. FOREIGN KEY (부서코드) REFERENCES 부서(부서코드)

이 노트에서 만든 변형 문제다. sqlite 3.49 에서 실행해 확인했다.

훈련 SQL정의 · 2번SQL

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

정답DELETE FROM 학생 WHERE 학년 = 4;
DROP TABLE 학생;

DELETE FROM 학생 WHERE 학년 = 4;DROP TABLE 학생;. 행을 지우는 것과 테이블을 없애는 것은 다른 명령이다.

원리 — DELETE 는 조건에 맞는 행만 지우고 테이블(틀)은 남는다 — DML 이라 ROLLBACK 으로 되돌릴 수 있다. DROP 은 테이블의 틀과 데이터를 통째로 없앤다 — DDL 이라 되돌릴 수 없다. 둘 사이에 TRUNCATE(행만 전부 지움, 틀은 남김, 되돌리기 불가)가 있다. "학년이 4인 학생만"은 조건이 있으니 DELETE, "테이블 자체"는 DROP 이다.

따라가기

  1. 행 삭제 → DELETE FROM 학생 WHERE 학년 = 4;
  2. 테이블 삭제 → DROP TABLE 학생;

이 노트에서 만든 변형 문제다. sqlite 3.49 에서 실행해 확인했다.

훈련 SQL정의 · 3번SQL

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

정답REVOKE SELECT ON 학생 FROM 김기사;

REVOKE SELECT ON 학생 FROM 김기사;

원리 — 권한을 거두는 명령은 REVOKE 권한 ON 대상 FROM 사용자 다. 주는 GRANT 가 TO 를 쓰는 것과 짝을 이루어 REVOKE 는 FROM 이다. 김기사가 WITH GRANT OPTION 으로 남에게 넘긴 권한까지 거두려면 끝에 CASCADE 를 붙이고, 넘긴 것이 있으면 거부하려면 RESTRICT 다. 이 문제는 그 조건이 없으니 기본 꼴이다.

따라가기

  1. REVOKE SELECT — 무슨 권한
  2. ON 학생 — 무엇의
  3. FROM 김기사 — 누구에게서

GRANT 문과 나란히 적어 두면 TO 와 FROM 이 바뀌는 실수가 사라진다.

이 노트에서 만든 변형 문제다. sqlite 3.49 에서 실행해 확인했다.

훈련 SQL정의 · 4번SQL

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

ALTER TABLE 학생 ① 이메일 VARCHAR(50); ② INDEX idx_name ON 학생(이름);
정답① ADD ② CREATE

— ① ADD ② CREATE. 열을 더하는 ALTER 의 낱말과 인덱스를 만드는 문장의 시작이다.

원리 — 이미 있는 테이블의 구조를 바꾸는 명령이 ALTER TABLE 이고, 그 뒤에 ADD 열 자료형(열 추가) · DROP COLUMN 열(열 삭제) · MODIFY 또는 ALTER COLUMN(열 변경)이 온다. 인덱스는 테이블과 별개의 객체라 CREATE INDEX 이름 ON 테이블(열) 로 만들고 DROP INDEX 로 없앤다. 만드는 것은 전부 CREATE, 없애는 것은 DROP 이다.

따라가기

  1. ALTER TABLE 학생 ADD 이메일 VARCHAR(50)
  2. CREATE INDEX idx_name ON 학생(이름)

이 노트에서 만든 변형 문제다. sqlite 3.49 에서 실행해 확인했다.

훈련 SQL정의 · 5번SQL

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

INSERT INTO 학생 VALUES (4, '홍길동', 1); COMMIT; DELETE FROM 학생 WHERE 학번 = 4; DELETE FROM 학생 WHERE 학번 = 1; ROLLBACK;
정답4

— 4. COMMIT 까지의 결과(4 행)는 굳어졌고, 그 뒤의 DELETE 두 번은 ROLLBACK 으로 취소된다.

원리 — 트랜잭션은 "여기까지를 한 덩어리로"다. COMMIT 은 지금까지의 변경을 확정해 되돌릴 수 없게 하고, ROLLBACK 은 마지막 COMMIT 이후의 변경을 전부 취소한다. INSERT 뒤에 COMMIT 을 했으니 4 행이 기준점이 되고, 그 뒤 두 DELETE 로 2 행이 됐다가 ROLLBACK 이 기준점으로 되돌려 다시 4 행이다.

따라가기

  1. 3 행 → INSERT → 4 행 → COMMIT (기준점 4)
  2. DELETE 4 → 3 행, DELETE 1 → 2 행
  3. ROLLBACK → 기준점으로 → 4

이 노트에서 만든 변형 문제다. sqlite 3.49 에서 실행해 확인했다.

07백지 재현

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