DML 완벽 정리
SQLD 시험 출제 범위의 INSERT·UPDATE·DELETE·MERGE를 구문 예시와 함께 정리
1. DML 개요
DML이란?
DML(Data Manipulation Language)은 테이블의 데이터를 조회·삽입·수정·삭제하는 SQL 명령어입니다. DDL과 달리 COMMIT 전까지 ROLLBACK이 가능합니다.
DML 명령어 종류
| 명령어 | 설명 |
|---|---|
| SELECT | 데이터 조회 |
| INSERT | 데이터 삽입 |
| UPDATE | 데이터 수정 |
| DELETE | 데이터 삭제 |
| MERGE | 조건부 삽입/수정/삭제 (UPSERT) |
2. INSERT
단일행 INSERT
-- 컬럼 지정
INSERT INTO EMP (EMP_ID, EMP_NAME, DEPT_ID)
VALUES (1, '김철수', 10);
-- 컬럼 생략 (모든 컬럼에 값 필수)
INSERT INTO EMP
VALUES (1, '김철수', 10, 3000, 'A');
컬럼 리스트를 생략하면 테이블의 모든 컬럼에 대해 순서대로 값을 입력해야 합니다.
서브쿼리 INSERT
SELECT 결과를 한 번에 INSERT합니다. VALUES 키워드를 사용하지 않습니다.
INSERT INTO EMP_BACKUP (EMP_ID, EMP_NAME)
SELECT EMP_ID, EMP_NAME FROM EMP
WHERE DEPT_ID = 10;
컬럼 수와 데이터 타입이 일치해야 합니다.
INSERT ALL (Oracle)
하나의 SELECT 결과를 여러 테이블에 동시에 삽입합니다.
-- 무조건 분배
INSERT ALL
INTO TABLE_A (COL1) VALUES (V1)
INTO TABLE_B (COL1) VALUES (V2)
SELECT V1, V2 FROM SOURCE;
-- 조건부 분배
INSERT ALL
WHEN SAL > 5000 THEN INTO HIGH_SAL VALUES (ID, SAL)
WHEN SAL <= 5000 THEN INTO LOW_SAL VALUES (ID, SAL)
SELECT ID, SAL FROM EMP;
INSERT FIRST를 사용하면 첫 번째 조건에 해당하는 테이블에만 삽입됩니다 (ALL은 모든 조건 체크).
3. UPDATE
기본 구문
UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2
WHERE 조건;
WHERE 절을 생략하면 모든 행이 수정됩니다 — 시험에서 자주 출제되는 함정!
서브쿼리를 이용한 UPDATE
-- SET절 서브쿼리
UPDATE EMP
SET SALARY = (SELECT AVG(SALARY) FROM EMP)
WHERE DEPT_ID = 10;
-- WHERE절 서브쿼리
UPDATE EMP
SET SALARY = SALARY * 1.1
WHERE DEPT_ID IN (SELECT DEPT_ID FROM DEPT WHERE LOC = '서울');
UPDATE 주의사항
- 1. WHERE 절 생략 시 — 전체 행 수정 (매우 위험)
- 2. FK 참조 중인 PK 값 변경 — 참조 무결성 위반 에러 발생
- 3. NOT NULL 컬럼에 NULL 설정 — 제약조건 위반 에러 발생
- 4. CHECK 제약조건 위반 값 — 범위 밖 값 입력 시 에러 발생
4. DELETE
기본 구문
DELETE [FROM] 테이블명
WHERE 조건;
Oracle에서는 FROM 생략 가능, SQL Server에서는 FROM 필수입니다.
DELETE vs TRUNCATE vs DROP
| 항목 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 분류 | DML | DDL | DDL |
| ROLLBACK | 가능 | 불가 | 불가 |
| 테이블 구조 | 유지 | 유지 | 삭제 |
| 저장 공간 | 유지 | 해제 | 해제 |
5. MERGE
MERGE란?
대상 테이블과 소스 테이블을 비교하여 조건에 따라 INSERT, UPDATE, DELETE를 한 번에 수행하는 명령어입니다. UPSERT(존재하면 수정, 없으면 삽입)를 구현할 때 사용합니다.
MERGE 구문
MERGE INTO 대상테이블 T
USING 소스테이블 S
ON (T.ID = S.ID)
WHEN MATCHED THEN
UPDATE SET T.NAME = S.NAME, T.SAL = S.SAL
[DELETE WHERE T.SAL = 0]
WHEN NOT MATCHED THEN
INSERT (ID, NAME, SAL) VALUES (S.ID, S.NAME, S.SAL);
MERGE 핵심 정리
| 절 | 설명 | 동작 |
|---|---|---|
| MERGE INTO | 변경할 대상 테이블 지정 | - |
| USING | 비교 소스 (테이블/서브쿼리) | - |
| ON | 매칭 조건 지정 | - |
| WHEN MATCHED | 조건에 일치하는 행 | UPDATE / DELETE |
| WHEN NOT MATCHED | 조건에 불일치하는 행 | INSERT |
6. 시험 빈출 포인트
반드시 알아야 할 포인트
- 1. DML은 ROLLBACK 가능 — COMMIT 전이면 변경사항 취소 가능 (DDL과의 핵심 차이)
- 2. 서브쿼리 INSERT에는 VALUES 없음 — INSERT INTO ... SELECT ... 형태
- 3. UPDATE WHERE 생략 = 전체 수정 — 의도치 않은 전체 행 변경 주의
- 4. DELETE FROM에서 FROM 생략 여부 — Oracle은 생략 가능, SQL Server는 필수
- 5. MERGE의 WHEN MATCHED/NOT MATCHED — MATCHED에서 UPDATE/DELETE, NOT MATCHED에서 INSERT
- 6. INSERT ALL vs INSERT FIRST — ALL은 모든 조건 체크, FIRST는 첫 매칭 조건만
- 7. NULL 값 INSERT — 명시적으로 NULL 또는 ''(빈 문자열, Oracle에서는 NULL 취급)
- 8. FK 참조 중인 부모 행 DELETE — ON DELETE 옵션에 따라 동작이 달라짐
개념을 확인했다면 문제로 실력을 검증해보세요