현재 선택한 SQL 과정

SQLD 이론 학습

이론 목록으로 돌아가기

DML: INSERT·UPDATE·DELETE·MERGE

행을 생성·변경·삭제하는 DML과 조건 누락 위험, MERGE의 일치·불일치 처리를 정리한다.

예상 읽기 6

핵심 요약

행을 생성·변경·삭제하는 DML과 조건 누락 위험, MERGE의 일치·불일치 처리를 정리한다.

핵심 질문

  1. DML: INSERT·UPDATE·DELETE·MERGE에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • INSERT·UPDATE·DELETE의 대상 행과 영향을 예측한다.
  • MERGE가 필요한 동기화 패턴을 설명한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
대상 행 식별 → INSERT·UPDATE·DELETE·MERGE → 영향 행 확인 → COMMIT·ROLLBACK

핵심 내용

DML은 테이블의 행을 다룬다. INSERT는 새 행을 만들고, UPDATE는 기존 행의 값을 바꾸며, DELETE는 조건에 맞는 행을 제거한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UPDATE account
SET balance = balance - 10000
WHERE account_no = 'A001';

WHERE가 없으면 UPDATE와 DELETE는 모든 행에 적용된다. 실행 전 동일한 조건의 SELECT로 대상 건수를 확인하는 습관이 중요하다. 다른 테이블이나 서브쿼리에서 읽은 결과를 INSERT할 수도 있다.

MERGE는 조인 조건이 일치하면 UPDATE, 일치하지 않으면 INSERT하는 동기화 작업을 한 문장으로 표현한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
MERGE INTO target t
USING source s ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.val = s.val
WHEN NOT MATCHED THEN INSERT (id, val) VALUES (s.id, s.val);

흔한 오해와 주의점

  • UPDATE의 SET 절에서 값을 동시에 계산할 때는 변경 전 행 값을 기준으로 해석하는 규칙을 확인한다.
  • DELETE는 행을 제거하지만 테이블 구조를 제거하지 않는다.
  • MERGE의 조인 조건이 대상 한 행과 여러 번 일치하면 오류나 비결정적 설계 위험이 있으므로 소스 유일성을 확인한다.

문항 풀이 보강: DML 결과와 MERGE 판정

INSERT에서 컬럼 목록을 생략하면 테이블 정의의 모든 컬럼에 순서대로 값을 제공해야 한다. 컬럼 목록을 쓰면 생략한 컬럼에는 기본값 또는 NULL이 들어가며 NOT NULL 규칙을 만족해야 한다. 문자열 길이와 데이터 타입도 함께 검사한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
INSERT INTO tbl (id, amt, degree)
VALUES (1, 100, 'A');

UPDATE의 SET 식은 각 대상 행의 변경 전 값을 기준으로 계산한다. WHERE가 없으면 모든 행이 대상이다. DELETE도 WHERE가 없으면 모든 행을 제거하지만 구조는 남는다.

최신 소스 한 건으로 MERGE

소스에 같은 키가 여러 건이면 먼저 최신 행 한 건을 정해야 한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
MERGE INTO dept d
USING (
  SELECT dept_code, dept_name, manager
  FROM (
    SELECT t.*,
           ROW_NUMBER() OVER (
             PARTITION BY dept_code
             ORDER BY change_dt DESC
           ) rn
    FROM tmp_dept t
  )
  WHERE rn = 1
) s
ON (d.dept_code = s.dept_code)
WHEN MATCHED THEN
  UPDATE SET d.manager = s.manager
WHEN NOT MATCHED THEN
  INSERT (dept_code, dept_name, manager)
  VALUES (s.dept_code, s.dept_name, s.manager);

ON은 일치 여부를 결정하고, 소스의 동일 키가 대상 한 행과 여러 번 일치하면 안정적인 갱신이 되지 않는다. 따라서 MERGE 문법만 아니라 소스 유일성까지 확인한다.

Transaction과 영향 행 확인

DML 실행 후에는 성공 여부뿐 아니라 기대한 행 수가 변경됐는지 확인한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UPDATE orders
SET    status = 'EXPIRED'
WHERE  status = 'READY'
AND    expire_at < SYSTIMESTAMP;

Application의 Update Count 또는 PL/SQL SQL%ROWCOUNT가 예상 범위를 벗어나면 Commit 전에 오류로 처리할 수 있다. WHERE가 넓어지는 사고를 막기 위해 동일한 조건의 SELECT로 영향 행을 먼저 확인한다.

INSERT SELECT와 UPDATE Subquery

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
INSERT INTO order_archive
SELECT * FROM orders
WHERE order_date < ADD_MONTHS(TRUNC(SYSDATE,'MM'), -12);

집합 DML은 Call을 줄이지만 한 Transaction이 지나치게 커질 수 있으므로 Undo·Redo·Lock·복구 단위를 계산한다.

오류 처리

대량 적재에서 일부 행 오류를 별도로 기록해야 한다면 DML Error Logging을 검토할 수 있지만, 업무 원자성이 “전부 성공 또는 전부 실패”라면 부분 성공이 허용되는지 먼저 결정한다. MERGE는 Source Key를 유일하게 만들어 Target 한 행이 여러 Source 행과 Match하지 않게 한다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. DELETE와 TRUNCATE의 트랜잭션·구조 차이는?
  2. MERGE의 ON 조건은 무엇을 결정하는가?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?