DB

[MySQL] UPDATE + JOIN 활용법 완전 정리 – 다중 테이블을 수정하는 강력한 방법

인생아 2025. 6. 30. 20:59
반응형

MySQL에서 데이터를 수정할 때, 한 테이블의 값을 다른 테이블의 정보에 따라 조건부로 업데이트해야 하는 경우가 많다.
예를 들어 사용자 등급을 구독 정보에 따라 수정하거나, 주문 상태를 결제 이력에 따라 변경해야 할 때는 UPDATE + JOIN 문법이 가장 효과적인 선택이다.

✅ UPDATE + JOIN 기본 문법

UPDATE 테이블1 별칭1
JOIN 테이블2 별칭2 ON 조인조건
SET 별칭1.컬럼 = 새로운값
WHERE 조건;
  • UPDATE는 수정할 대상 테이블을 지정한다
  • JOIN을 통해 기준 테이블과 연결하여 필요한 값을 참조한다
  • SET 구문에는 반드시 UPDATE 대상 테이블의 컬럼만 지정해야 한다

✅ 기본 예제: 사용자 등급 수정

UPDATE users u
JOIN subscriptions s ON u.id = s.user_id
SET u.grade = 'premium'
WHERE s.expire_date > NOW();

이 쿼리는 유효한 구독이 남아있는 사용자만 골라 등급을 'premium'으로 수정한다.
JOIN을 통해 조건이 더 정교해지고, 비즈니스 로직도 깔끔하게 구현할 수 있다.

반응형

✅ 다중 컬럼 업데이트 예제

UPDATE orders o
JOIN payments p ON o.id = p.order_id
SET o.status = '결제완료',
    o.payment_date = p.paid_at
WHERE o.status = '결제대기' AND p.status = '완료';

결제가 완료된 주문에 대해 상태와 결제일을 동시에 업데이트하는 예제이다.
JOIN 조건 + 다중 컬럼 수정 조합은 실무에서 가장 자주 활용되는 형태이다.

✅ LEFT JOIN을 활용한 예제

UPDATE products p
LEFT JOIN inventory i ON p.id = i.product_id
SET p.stock_status = '품절'
WHERE i.stock IS NULL;

LEFT JOIN을 활용하면 매칭되지 않는 데이터를 기준으로 업데이트할 수 있다.
이 예제는 재고가 존재하지 않는 상품의 상태를 '품절'로 설정한다.

✅ 실전 예제: 마케팅용 등급 일괄 수정

UPDATE customers c
JOIN (
  SELECT user_id, COUNT(*) AS purchase_count
  FROM orders
  WHERE order_date >= CURDATE() - INTERVAL 6 MONTH
  GROUP BY user_id
) o ON c.id = o.user_id
SET c.marketing_grade = CASE
  WHEN o.purchase_count >= 10 THEN 'VIP'
  WHEN o.purchase_count >= 5 THEN 'GOLD'
  ELSE 'SILVER'
END;

서브쿼리 JOIN을 활용해 조건별 등급을 일괄 수정하는 고급 예제이다.
쿼리 내부에 집계 로직이 포함되며, 마케팅 DB에서 많이 쓰이는 형태이다.

반응형

✅ UPDATE JOIN 시 주의사항

항목 설명
수정 대상은 UPDATE 절에 명시된 테이블만 가능 JOIN된 테이블의 값은 직접 수정 불가
JOIN 조건 누락 시 카디널리티 증가 잘못된 JOIN으로 인해 전체 행이 수정될 수 있음
WHERE 절로 타겟 제한 필수 조건 없이 실행하면 과도한 데이터가 수정될 수 있음
인덱스 존재 여부 확인 JOIN 성능은 인덱스에 크게 좌우됨

항상 UPDATE 전에 다음과 같이 SELECT로 조인 결과를 먼저 확인하는 습관이 중요하다.

SELECT u.id, s.expire_date
FROM users u
JOIN subscriptions s ON u.id = s.user_id
WHERE s.expire_date > NOW();

✅ 트랜잭션과 함께 사용하는 예제

START TRANSACTION;

UPDATE accounts a
JOIN users u ON a.user_id = u.id
SET a.status = '잠금'
WHERE u.status = '정지';

COMMIT;

정합성이 중요한 데이터를 조정할 때는 트랜잭션을 활용해 안정성을 확보해야 한다.

✅ UPDATE JOIN이 필요한 대표적인 상황

  • 회원정보를 결제 이력에 따라 조정할 때
  • 상품 정보를 재고 테이블과 동기화할 때
  • 등급, 상태, 포인트 등 기준 값이 다른 테이블에 있을 때
  • 서브쿼리 JOIN으로 집계 조건에 따라 갱신할 때

✅ 공식 문서 참고 링크

반응형