INSERT·UPDATE·DELETE·MERGE로 테이블의 행을 넣고 고치고 지웁니다. INSERT 규칙, WHERE 누락, MERGE 분기, DELETE와 TRUNCATE의 차이를 기출 중심으로 익힙니다.
최빈출기출 11회분 중 42문항 · 많이 나온 주제: INSERT(29), UPDATE(19), DELETE(15)
학습 목표
INSERT·UPDATE·DELETE·MERGE로 테이블의 행을 넣고 고치고 지웁니다. INSERT 규칙, WHERE 누락, MERGE 분기, DELETE와 TRUNCATE의 차이를 기출 중심으로 익힙니다.
01
DML 한눈에 보기
DML(Data Manipulation Language)은 테이블 안의 데이터(행)를 다루는 명령입니다. 테이블을 노트에 비유하면 INSERT는 새 줄 적기, UPDATE는 줄 고치기, DELETE는 줄 지우기, MERGE는 '있으면 고치고 없으면 적기'입니다. SELECT도 DML로 분류합니다(교재에 따라 DQL로 따로 보기도 합니다).
DML은 트랜잭션으로 묶입니다. COMMIT 전까지는 변경 내용이 확정되지 않아 ROLLBACK으로 되돌릴 수 있고, 다른 사용자는 아직 그 변경을 볼 수 없습니다. 반대로 CREATE·ALTER·DROP·TRUNCATE 같은 DDL은 실행하는 순간 자동 COMMIT됩니다.
개념 정리DML 네 가지
INSERT
새 행 입력
VALUES · SELECT · INSERT ALL/FIRST
UPDATE
기존 행 수정
SET 열 = 값, ... · WHERE 누락 시 전체 행
DELETE
행 삭제
구조는 남음 · ROLLBACK 가능
MERGE
있으면 수정, 없으면 입력
WHEN MATCHED UPDATE · WHEN NOT MATCHED INSERT
DML은 COMMIT해야 확정된다
확정
INSERT→
UPDATE→
DELETE→
COMMIT→
영구 반영 · 다른 사용자도 조회
취소
INSERT→
UPDATE→
DELETE→
ROLLBACK→
세 변경 모두 취소
COMMIT·ROLLBACK·SAVEPOINT 같은 트랜잭션 제어는 TCL 단원에서 자세히 다룹니다.
02
INSERT
INSERT INTO 테이블 (열, ...) VALUES (값, ...)로 한 행을 넣습니다. 열 목록을 생략하면 테이블 정의 순서대로 모든 열의 값을 빠짐없이 적어야 합니다. 열 목록을 적었다면 빠진 열은 DEFAULT 값, DEFAULT가 없으면 NULL이 들어갑니다. 그래서 NOT NULL이면서 DEFAULT가 없는 열은 생략할 수 없습니다.
값은 열의 데이터 타입에 맞아야 합니다. DATE 열에 숫자 20240606을 그대로 넣으면 오류이고, TO_DATE('20240606', 'YYYYMMDD')나 SYSDATE를 씁니다. 제약조건(PK 중복, NOT NULL, CHECK)을 어기면 그 문장만 실패하고, 앞에서 성공한 문장은 그대로 남습니다.
다른 테이블의 조회 결과를 넣을 때는 INSERT INTO 테이블 (열) SELECT ...처럼 AS 없이 바로 SELECT를 씁니다. AS는 CREATE TABLE ... AS SELECT(CTAS)에서만 씁니다. Oracle의 INSERT ALL은 조건이 참인 모든 WHEN 절에, INSERT FIRST는 처음 참이 된 WHEN 절 하나에만 넣습니다.
-- 모든 열: 정의 순서대로 전부INSERTINTO EMP VALUES(1,'김철수','D1',3000);-- 일부 열: 빠진 DEPT, SAL은 DEFAULT 또는 NULLINSERTINTOEMP(EMP_ID, NAME)VALUES(2,'이영희');-- 조회 결과 넣기: AS 없이 바로 SELECTINSERTINTOEMP_BACKUP(EMP_ID, NAME)SELECT EMP_ID, NAME FROM EMP WHERE DEPT ='D1';
빈 EMP에 두 문장을 실행하면
EMP (0행)
EMP_ID
NAME
DEPT
SAL
(비어 있음)
INSERT→두 번째는 EMP_ID, NAME만
INSERT 2번 후
EMP_ID
NAME
DEPT
SAL
1
김철수
D1
3000
2
이영희
NULL
NULL
열 목록에 없던 DEPT·SAL은 NULL로 채워졌습니다. 이 열에 DEFAULT가 있었다면 그 값이 들어갑니다.
INSERT ALL과 INSERT FIRST — SRC(C1) = 1, 4, 7
구문
1
4
7
T1 / T2 / T3 행 수
INSERT ALL
T3
T1
T1, T2 둘 다
2 / 1 / 1
INSERT FIRST
T3
T1
T1만
2 / 0 / 1
INSERTFIRST-- ALL로 바꾸면 7은 T2에도 들어감WHEN C1 >=3THENINTO T1
WHEN C1 >=5THENINTO T2
ELSEINTO T3
SELECT C1 FROM SRC;
03
UPDATE
UPDATE 테이블 SET 열 = 값 WHERE 조건으로 조건에 맞는 행을 고칩니다. 여러 열을 고칠 때는 SET SAL = 5000, DEPT = 'D2'처럼 쉼표로 구분합니다(AND가 아닙니다). WHERE를 빠뜨리면 모든 행이 수정됩니다.
SET의 값이나 WHERE 조건에 서브쿼리를 쓸 수 있습니다. 이때 WHERE에 바깥 행과 연결되지 않은 EXISTS를 쓰면, 서브쿼리에 행이 하나라도 있는 순간 모든 행이 수정되는 함정이 있습니다.
-- D1 부서만 10% 인상UPDATE EMP
SET SAL = SAL *1.1WHERE DEPT ='D1';-- 여러 열은 쉼표로UPDATE EMP
SET SAL =5000, DEPT ='D2'WHERE EMP_ID =1;-- 서브쿼리 값으로 수정UPDATE EMP
SET SAL =(SELECTAVG(SAL)FROM EMP)WHERE EMP_ID =1;
D1 부서만 SAL × 1.1
변경 전
EMP_ID
NAME
DEPT
SAL
1
김
D1
3000
2
이
D1
4000
3
박
D2
3500
UPDATE→WHERE DEPT = 'D1'
변경 후 (2행 수정)
EMP_ID
NAME
DEPT
SAL
1
김
D1
3300
2
이
D1
4400
3
박
D2
3500
D2인 박은 그대로입니다. WHERE를 빼면 세 명 모두 인상됩니다.
04
DELETE
DELETE FROM 테이블 WHERE 조건으로 조건에 맞는 행을 지웁니다. WHERE를 빼면 모든 행이 삭제되지만 테이블 구조는 남습니다. DML이므로 COMMIT 전이면 ROLLBACK으로 되돌릴 수 있습니다.
모든 행을 지우는 방법은 세 가지입니다. DELETE(DML, 행 단위, 롤백 가능), TRUNCATE(DDL, 전체 행만 한 번에, 자동 COMMIT, WHERE 불가), DROP(DDL, 구조까지 삭제)입니다. 자세한 비교는 DDL 단원에 있습니다.
-- 조건 삭제DELETEFROM EMP WHERE DEPT ='D9';-- 모든 행 삭제 (구조는 유지, ROLLBACK 가능)DELETEFROM EMP;
D9 부서 행만 삭제
변경 전
EMP_ID
NAME
DEPT
1
김
D1
2
이
D1
9
최
D9
DELETE→WHERE DEPT = 'D9'
변경 후 (1행 삭제)
EMP_ID
NAME
DEPT
1
김
D1
2
이
D1
모든 행을 지우는 세 가지
명령
분류
WHERE
구조
ROLLBACK
DELETE
DML
가능
유지
가능
TRUNCATE
DDL
불가
유지
불가 (자동 COMMIT)
DROP
DDL
불가
삭제
불가 (자동 COMMIT)
05
MERGE
MERGE는 원본(USING)의 각 행을 대상(INTO)과 ON 조건으로 비교합니다. 짝이 있으면 WHEN MATCHED THEN UPDATE, 없으면 WHEN NOT MATCHED THEN INSERT를 실행합니다. '있으면 수정, 없으면 입력'을 한 문장으로 처리해 UPSERT라고도 합니다.
WHEN MATCHED 절에는 DELETE WHERE 조건을 붙일 수 있습니다. 이 DELETE는 UPDATE된 결과 값을 기준으로, 짝이 맞아 수정된 행 중에서만 삭제 대상을 고릅니다. 원본과 짝이 없는 대상 행은 손대지 않고, NOT MATCHED로 새로 들어온 행도 지우지 않습니다.
MERGEINTO EMP E
USING NEW_EMP N
ON(E.EMP_ID = N.EMP_ID)WHENMATCHEDTHENUPDATESET E.SAL = N.SAL
WHENNOTMATCHEDTHENINSERT(EMP_ID, NAME, SAL)VALUES(N.EMP_ID, N.NAME, N.SAL);
MERGE: 1번은 수정, 2번은 입력
EMP (대상)
EMP_ID
NAME
SAL
1
김
3000
+
NEW_EMP (원본)
EMP_ID
NAME
SAL
1
김
5000
2
이
4000
MERGE→1 MATCHED → UPDATE · 2 NOT MATCHED → INSERT
MERGE 후 EMP
EMP_ID
NAME
SAL
1
김
5000
2
이
4000
1번은 EMP에 있어서 SAL만 5000으로 수정, 2번은 없어서 새 행으로 입력됩니다.
원본 한 행이 처리되는 순서
MERGE
원본 행 하나→
ON 조건으로 대상에 짝 찾기→
짝 있음 → UPDATE (→ DELETE WHERE)→
짝 없음 → INSERT
보충 실습여기부터는 테이블을 직접 만들어 보는 긴 SQL 실습입니다. 처음 공부할 때는 건너뛰고, 위 내용을 이해한 뒤 돌아와도 됩니다.
06
SQL 실전: INSERT → UPDATE → DELETE 흐름 따라가기
보충 실습
3행짜리 EMP에 INSERT → UPDATE → DELETE를 차례로 실행합니다. 4번 최를 추가하고, D1 두 명만 10% 올린 뒤, 4번을 다시 지웁니다. 모두 COMMIT 전이라면 ROLLBACK 한 번으로 처음 3행으로 돌아갑니다.
INSERTINTO EMP VALUES(4,'최','D2',4500);UPDATE EMP SET SAL = SAL *1.1WHERE DEPT ='D1';DELETEFROM EMP WHERE EMP_ID =4;COMMIT;-- 또는 ROLLBACK;
세 문장을 차례로 적용
처음 3행
EMP_ID
NAME
DEPT
SAL
1
김
D1
3000
2
이
D1
4000
3
박
D2
3500
INSERT→4번 추가
INSERT 후 4행
EMP_ID
NAME
DEPT
SAL
1
김
D1
3000
2
이
D1
4000
3
박
D2
3500
4
최
D2
4500
UPDATE → DELETE→D1 인상, 4번 삭제
UPDATE·DELETE 후 3행
EMP_ID
NAME
DEPT
SAL
1
김
D1
3300
2
이
D1
4400
3
박
D2
3500
행은 바뀌어도 테이블 구조는 그대로입니다. 같은 '삭제'라도 TRUNCATE·DROP은 DDL이라 자동 COMMIT되어 되돌릴 수 없습니다.
참고: 이미 있는 열의 DEFAULT를 ALTER TABLE ... MODIFY로 바꾸면 이후 입력되는 행에만 적용되고 기존 행은 그대로입니다. 다만 Oracle에서 ADD 로 DEFAULT가 있는 새 열을 추가하면 기존 행에도 그 값이 채워집니다.