SQL MERGE 구문 가이드: INSERT, UPDATE, DELETE

안녕하세요! 오늘은 SQL MERGE 문을 심층적으로 살펴보겠습니다. MERGE 문은 단순히 INSERT, UPDATE, DELETE 작업을 통합하는 기능을 넘어 데이터 조작의 새로운 지평을 열어줍니다. 이 글에서는 기본적인 사용법부터 흥미로운 활용 사례까지, MERGE 문의 다채로운 매력을 탐구해보도록 하겠습니다.

Merge diagram

1. MERGE 문의 핵심:

MERGE 문은 두 테이블을 비교하여 데이터를 동기화하는 데 핵심적인 역할을 합니다. 기존의 여러 쿼리를 하나로 통합하여 코드의 간결성을 높이고 성능 향상을 가져다줍니다.

2. MERGE 문의 구조:

MERGE INTO 대상_테이블 AS t
USING 조인_테이블 AS s
ON 조건
[WHEN MATCHED THEN 작업1]
[WHEN NOT MATCHED THEN 작업2]

3. 주요 구성 요소:

  • 대상 테이블: 작업을 수행할 테이블입니다.
  • 조인 테이블: 비교할 테이블입니다.
  • ON 조건: 두 테이블을 연결하는 조건입니다.
  • WHEN MATCHED: 조건에 일치하는 행에 대해 수행할 작업입니다.
  • WHEN NOT MATCHED: 조건에 일치하지 않는 행에 대해 수행할 작업입니다.

4. MERGE 문 활용 사례:

1) 두 테이블의 데이터 동기화:

MERGE INTO employees AS e
USING new_hires AS n
ON e.id = n.id
WHEN MATCHED THEN
    UPDATE SET e.name = n.name, e.email = n.email
WHEN NOT MATCHED THEN
    INSERT (id, name, email) VALUES (n.id, n.name, n.email)

2) 특정 조건에 맞는 데이터만 업데이트:

MERGE INTO products AS p
USING sales_data AS s
ON p.id = s.product_id
WHEN MATCHED AND s.quantity > 100 THEN
    UPDATE SET p.price = p.price * 0.9

3) 테이블에 없는 데이터 삭제:

MERGE INTO customers AS c
USING orders AS o
ON c.id = o.customer_id
WHEN NOT MATCHED THEN
    DELETE;

4) UPSERT 기능:

MERGE INTO users AS u
USING new_users AS n
ON u.email = n.email
WHEN MATCHED THEN
    UPDATE SET u.name = n.name, u.age = n.age
WHEN NOT MATCHED THEN
    INSERT (email, name, age) VALUES (n.email, n.name, n.age);

5. MATCH 부정 조건 활용:

MERGE INTO products AS p
USING discontinued_products AS d
ON p.id = d.id
WHEN MATCHED THEN
    UPDATE SET p.status = 'DISCONTINUED'
WHEN NOT MATCHED BY SOURCE THEN
    UPDATE SET p.status = 'ACTIVE';

6. 여러 테이블 조인:

MERGE INTO orders AS o
USING customers AS c
ON o.customer_id = c.id
USING products AS p
ON o.product_id = p.id
...

7. 마무리:

MERGE 문은 데이터 조작의 효율성을 극대화하는 강력한 도구입니다. 다양한 활용 사례를 익히고, 여러분의 작업에 적용하여 보