모던지 / SQL 개발자 / SQL 기본 및 활용 14강. DDL과 DML

SQL 기본 및 활용 14강. DDL과 DML

DELETE는 되돌릴 수 있고 TRUNCATE는 되돌릴 수 없습니다. 같은 "다 지운다"인데 한쪽은 취소 버튼이 있습니다.

풀고 시작

문제 1. 테이블의 모든 행을 지우는 세 명령에 대한 설명으로 옳은 것은?
DELETE는 데이터 조작어라 되돌릴 수 있고, TRUNCATE와 DROP은 데이터 정의어라 대체로 자동 커밋됩니다. 구조까지 지우는 것은 DROP뿐이며 TRUNCATE는 조건을 지정할 수 없습니다.

구조를 만드는 명령

DDL은 데이터가 담길 그릇을 다룹니다. CREATE로 만들고, ALTER로 바꾸고, DROP으로 지우고, TRUNCATE로 내용을 비우고, RENAME으로 이름을 바꿉니다.

테이블을 만들 때 함께 정하는 것이 제약 조건입니다. 1과목에서 본 모델의 규칙이 여기서 실제로 강제됩니다.

제약 조건 값이 없는 것 허용
PRIMARY KEY 주 식별자 허용하지 않습니다
UNIQUE 값이 유일 허용합니다
NOT NULL 값이 반드시 있음 해당 없음
FOREIGN KEY 다른 테이블의 키를 참조 허용합니다
CHECK 값의 범위나 형식 조건 조건에 따릅니다
DEFAULT 값을 주지 않았을 때의 기본값 해당 없음

여기서 시험 단골이 PRIMARY KEY와 UNIQUE의 차이입니다. 둘 다 값의 유일성을 보장하지만 주 식별자는 값이 없는 상태를 허용하지 않고, UNIQUE는 허용합니다. 1과목 4강에서 본 주식별자의 존재성 조건이 그대로 구현된 것이죠.

FOREIGN KEY는 참조 무결성을 지킵니다. 부모에 없는 값을 자식에 넣을 수 없고, 자식이 참조하는 부모 행을 그냥 지울 수도 없습니다. 부모를 지울 때의 동작을 지정할 수 있는데, 자식까지 함께 지우게 할 수도 있고 자식의 값을 비우게 할 수도 있으며 아무 지정이 없으면 삭제를 막습니다. 편해 보이는 연쇄 삭제는 실무에서 조심해야 합니다. 한 행을 지웠는데 수만 행이 함께 사라지는 일이 벌어질 수 있으니까요.

ALTER와 DROP, 그리고 TRUNCATE

ALTER로는 컬럼을 추가하고, 자료형이나 기본값을 바꾸고, 컬럼을 지우고, 제약 조건을 붙이거나 뗄 수 있습니다. 여기에도 규칙이 있습니다. 이미 데이터가 있는 테이블에 값이 반드시 있어야 하는 컬럼을 그냥 추가할 수는 없습니다. 기존 행의 그 자리를 무엇으로 채울지 정해지지 않으니까요. 기본값을 함께 지정하면 가능해집니다. 자료형을 줄이는 변경도 기존 값이 들어가지 못하면 거부됩니다.

DROP은 테이블 자체를 없앱니다. 구조와 데이터가 함께 사라집니다. TRUNCATE는 구조는 남기고 내용만 전부 비웁니다. 그리고 셋을 가르는 가장 중요한 성질이 여기 있습니다.

DELETE는 데이터 조작어입니다. 행을 하나하나 지우면서 되돌릴 준비를 하므로 조건을 걸어 일부만 지울 수 있고, 커밋하기 전이라면 롤백으로 되살릴 수 있습니다. TRUNCATE와 DROP은 데이터 정의어입니다. 저장 공간을 통째로 반납하는 방식이라 훨씬 빠르지만, 조건을 걸 수 없고 대체로 자동 커밋되어 되돌릴 수 없습니다.

그래서 실무의 규칙은 단순합니다. 전체를 비우는 것이 확실하고 속도가 필요하면 TRUNCATE, 조건이 있거나 되돌릴 여지를 남겨야 하면 DELETE입니다.

데이터를 넣고 바꾸고 지우기

INSERT는 행을 넣습니다. 컬럼 목록을 생략하면 테이블에 정의된 순서대로 값을 다 주어야 하고, 목록을 적으면 일부만 넣을 수 있습니다. 컬럼 목록을 적는 편이 언제나 안전합니다. 나중에 컬럼 순서가 바뀌거나 컬럼이 추가되면 목록 없는 INSERT는 조용히 틀린 자리에 값을 넣거나 실패합니다.

값을 직접 쓰는 대신 SELECT 결과를 그대로 넣을 수도 있습니다. 이때는 VALUES를 쓰지 않고 SELECT 문을 이어 붙이며, 컬럼 개수와 자료형이 맞아야 합니다.

UPDATE는 값을 바꿉니다. 여기서 가장 조심할 것은 WHERE 절을 빼먹는 것입니다. 조건이 없으면 테이블의 모든 행이 바뀝니다. 오류가 아니라 정상 동작이라 막아 주지 않죠. 습관 하나를 권한다면, 같은 조건으로 SELECT를 먼저 실행해 몇 건이 걸리는지 확인한 뒤 UPDATE로 바꾸는 것입니다.

DELETE도 같습니다. 조건 없는 DELETE는 전체를 지웁니다. 그리고 자식이 참조하는 부모 행을 지우려 하면 참조 무결성 때문에 거부됩니다. 이것은 방해가 아니라 보호입니다.

MERGE는 조건에 맞는 행이 있으면 갱신하고 없으면 삽입합니다. 같은 일을 UPDATE와 INSERT로 나눠 하면 대상을 두 번 읽게 되는데, MERGE는 한 번에 처리합니다. 배치 작업에서 자주 쓰이는 구문입니다.

다음 강은 이 변경들을 확정하고 되돌리는 트랜잭션 제어어, 그리고 권한을 다루는 데이터 제어어입니다. 이번 강에서 "커밋하기 전이라면"이라고 미뤄 둔 이야기가 거기서 정리됩니다.

인출 문제

문제 1. PRIMARY KEY와 UNIQUE 제약 조건의 차이로 옳은 것은?
둘 다 유일성을 보장하지만 값의 존재 여부에서 갈립니다. UNIQUE는 여러 개 지정할 수 있고 주 식별자도 여러 컬럼의 조합으로 지정할 수 있습니다.
문제 2. 데이터가 이미 들어 있는 테이블에 값이 반드시 있어야 하는 컬럼을 추가하려 할 때 필요한 조치는?
기존 행의 그 자리를 무엇으로 채울지 정해지지 않으면 추가가 거부됩니다. 기본값을 지정하면 기존 행이 그 값으로 채워지므로 추가할 수 있습니다.
문제 3. INSERT 문에서 컬럼 목록을 명시하는 것이 권장되는 이유는?
목록을 생략하면 테이블 정의 순서에 의존하게 되어 구조가 바뀌는 순간 조용히 틀린 결과를 만듭니다. 명시하면 구조 변경에도 문장의 의미가 유지됩니다.
문제 4. DELETE와 TRUNCATE의 차이로 옳지 않은 것은?
TRUNCATE는 데이터 정의어로 대체로 자동 커밋되므로 되돌릴 수 없습니다. 되돌릴 여지를 남겨야 하는 작업에는 DELETE를 써야 합니다.

더 풀기

출제기준의 세세항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. DDL에 속하는 명령으로 바르게 묶인 것은?
구조를 다루는 명령이 DDL입니다. TRUNCATE는 데이터를 지우지만 구조 수준에서 처리하므로 DDL로 분류합니다.
문제 2. 테이블을 만들 때 컬럼마다 반드시 지정해야 하는 것은?
이름과 자료형이 최소 요건입니다. 기본값과 제약은 필요할 때 붙입니다.
문제 3. 기본키 제약이 자동으로 보장하는 것은?
기본키는 유일성과 필수성을 함께 강제합니다. 자동 증가는 별도의 기능입니다.
문제 4. 유일 제약과 기본키 제약의 차이로 옳은 것은?
기본키는 하나뿐이고 NULL을 허용하지 않습니다. 유일 제약은 여러 개 둘 수 있고 NULL 처리 규칙이 제품마다 다릅니다.
문제 5. 외래키 제약이 보장하는 것은?
참조 무결성을 강제합니다. NULL은 관계가 없다는 뜻이라 허용됩니다.
문제 6. CHECK 제약이 하는 일로 가장 알맞은 것은?
값의 범위나 허용 목록을 강제할 때 씁니다. 도메인을 구조로 옮기는 수단입니다.
문제 7. 부모 행을 지울 때 자식 행도 함께 지워지게 하려면 외래키에 무엇을 지정하나요?
CASCADE는 연쇄 삭제입니다. SET NULL은 자식의 참조 컬럼을 비우고 RESTRICT는 삭제를 막습니다.
문제 8. ON DELETE CASCADE를 실무에서 조심해야 하는 이유로 가장 알맞은 것은?
편리하지만 되돌릴 수 없는 규모의 삭제를 만들 수 있습니다. 관계가 깊으면 특히 위험합니다.
문제 9. ALTER 명령으로 할 수 있는 일로 보기 어려운 것은?
행을 지우는 것은 DELETE나 TRUNCATE의 일입니다. ALTER는 구조를 바꿉니다.
문제 10. 이미 데이터가 있는 테이블에 NOT NULL 컬럼을 추가하려 할 때 필요한 조치는?
기존 행에 채울 값이 없으면 제약을 만족할 수 없습니다. 값을 먼저 마련해야 합니다.

묶음 2

문제 1. DROP과 TRUNCATE와 DELETE의 차이로 옳은 것은?
셋의 범위와 되돌림 가능성이 다릅니다. DELETE만 조건을 줄 수 있고 트랜잭션으로 되돌릴 수 있습니다.
문제 2. TRUNCATE가 DELETE보다 대개 빠른 이유로 가장 알맞은 것은?
DELETE는 행마다 로그를 남깁니다. TRUNCATE는 그 과정을 건너뛰므로 빠르지만 되돌리기 어렵습니다.
문제 3. TRUNCATE 실행 후 되돌리려 할 때의 특징으로 옳은 것은?
DDL은 실행과 함께 확정되는 것이 일반적입니다. 그래서 실수하면 백업에 의존해야 합니다.
문제 4. 여러 행을 한 번에 넣는 방법으로 가장 알맞은 것은?
조회 결과를 그대로 넣을 수 있습니다. 값 목록을 여러 줄로 나열하는 문법을 지원하는 제품도 있습니다.
문제 5. INSERT 문에서 컬럼 목록을 생략하면 어떤 규칙이 적용되나요?
정의 순서에 의존하므로 컬럼이 추가되면 문장이 조용히 깨집니다. 목록을 적어 두는 편이 안전합니다.
문제 6. INSERT 문에서 컬럼 목록을 명시하는 것이 권장되는 이유로 가장 알맞은 것은?
컬럼이 하나 추가되는 순간 순서 의존 문장은 엉뚱한 자리에 값을 넣거나 오류가 납니다.
문제 7. UPDATE 문에서 WHERE 절을 빠뜨리면 어떻게 되나요?
조건이 없으면 전체가 대상입니다. 실무에서 가장 뼈아픈 실수 가운데 하나입니다.
문제 8. UPDATE 문을 실행하기 전에 안전을 확인하는 방법으로 가장 알맞은 것은?
무엇이 바뀔지 먼저 눈으로 보는 것이 가장 확실합니다. 트랜잭션 안에서 실행하고 확인 후 확정하는 습관도 도움이 됩니다.
문제 9. 다른 테이블의 값을 참조해 UPDATE하려면 어떤 방법을 쓰나요?
갱신 대상 행마다 다른 값을 넣어야 하므로 바깥 행을 참조하는 서브쿼리가 필요합니다.
문제 10. 상관 서브쿼리로 UPDATE할 때 조건에 해당하는 행이 없으면 어떻게 되나요?
값이 없다고 건너뛰지 않고 NULL로 덮어씁니다. 그래서 WHERE에 EXISTS 조건을 함께 두어야 합니다.

묶음 3

문제 1. MERGE 문이 하는 일로 가장 알맞은 것은?
있으면 고치고 없으면 넣는 처리를 한 번에 합니다. 두 문장으로 나누면 그 사이에 다른 작업이 끼어들 수 있습니다.
문제 2. DELETE 문에서 조건에 맞는 행이 하나도 없으면 어떻게 되나요?
대상이 없는 것은 오류가 아닙니다. 실행 결과로 영향받은 행 수가 영으로 보고됩니다.
문제 3. 자식 행이 참조하고 있는 부모 행을 지우려 하면 어떻게 되나요?
기본 설정은 삭제를 막는 것입니다. CASCADE나 SET NULL을 지정하면 동작이 달라집니다.
문제 4. 컬럼을 삭제하는 작업이 위험한 이유로 가장 알맞은 것은?
구조를 되돌려도 값은 돌아오지 않습니다. 사용 여부를 확인하고 단계를 나누어 진행해야 합니다.
문제 5. 운영 중인 테이블의 컬럼 이름을 바꿀 때 안전한 절차로 가장 알맞은 것은?
한 번에 바꾸면 그 순간 참조하던 모든 곳이 깨집니다. 두 이름이 함께 존재하는 기간을 두어야 합니다.
문제 6. 자료형을 문자에서 숫자로 바꿀 때 확인해야 할 것은?
하나라도 변환할 수 없으면 작업이 실패합니다. 먼저 조회로 확인해야 합니다.
문제 7. 컬럼의 길이를 줄이려 할 때 제약으로 옳은 것은?
데이터를 잃는 변경은 막는 것이 기본입니다. 늘리는 방향은 대개 자유롭습니다.
문제 8. 테이블에 기본값을 지정하면 언제 적용되나요?
명시적으로 NULL을 넣으면 기본값이 아니라 NULL이 들어갑니다. 생략했을 때만 채워집니다.
문제 9. 기본값이 지정된 컬럼에 명시적으로 NULL을 넣으면 결과는?
생략과 명시적 NULL은 다른 행위입니다. 이 차이를 모르면 값이 비는 원인을 찾기 어렵습니다.
문제 10. 다음 중 옳지 않은 설명은?
DROP은 구조까지 없앱니다. 구조를 남기고 비우려면 TRUNCATE를 씁니다.

이전: 13강 PIVOT과 정규 표현식 · 다음: 15강 TCL과 DCL

모던지 · 궁금하면 모던지 GitHub · 2026-09-10