반응형
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으로 집계 조건에 따라 갱신할 때
✅ 공식 문서 참고 링크
반응형
'DB' 카테고리의 다른 글
[MySQL] UPDATE 문에서 NULL 처리하는 방법 완전 정리 (0) | 2025.07.01 |
---|---|
[MySQL] UPDATE + NOW() 함수로 날짜 자동 수정하는 실전 활용법 (0) | 2025.06.30 |
[MySQL] UPDATE + IF / CASE 문으로 조건부 데이터 수정하는 실전 가이드 (1) | 2025.06.30 |
[MySQL] UPDATE + 서브쿼리 완전 정복 – 조건 기반 동적 수정의 핵심 기술 (0) | 2025.06.30 |
[MySQL] UPDATE + WHERE (안전하고 정확한 데이터 수정 가이드) (0) | 2025.06.30 |
[MySQL] UPDATE로 다중 컬럼 동시에 수정하는 방법 완벽 정리 (0) | 2025.06.30 |
[MySQL] UPDATE 기본 문법 완벽 정리 – 데이터 수정 (3) | 2025.06.30 |
[MySQL] SELECT INTO OUTFILE + LOAD DATA INFILE 완벽 가이드 – 쿼리 결과 파일로 저장하고 다시 불러오는 방법 (0) | 2025.06.30 |