DB

[MySQL] DELETE + JOIN으로 두 테이블 이상에서 조건에 맞는 데이터 안전하게 삭제하는 방법

인생아 2025. 7. 2. 15:49
반응형

MySQL에서는 DELETE문을 사용할 때 하나의 테이블만 삭제 대상이 되는 것이 일반적이지만, JOIN과 함께 사용하면 다른 테이블의 조건을 기반으로 특정 테이블의 데이터를 삭제할 수 있다.
이 기능은 관계형 데이터베이스의 외래키 의존성 문제, 정합성 유지, 서브쿼리 없이 명확한 조건 설정에 매우 유용하다.

✅ DELETE + JOIN 기본 문법 구조

DELETE 대상_별칭
FROM 삭제_대상_테이블 AS 대상_별칭
JOIN 조인_테이블 AS 조인_별칭
ON 조인_조건
WHERE 필터링_조건;

이 문법은 JOIN된 결과에서 삭제 대상 테이블의 조건에 맞는 행만 정확히 삭제한다.

✅ 예제 1: 특정 조건에 맞는 사용자 댓글 삭제

DELETE c
FROM comments AS c
JOIN users AS u ON c.user_id = u.id
WHERE u.status = '탈퇴';

탈퇴한 사용자(users.status = '탈퇴')의 댓글(comments)만 삭제하는 예제이다.
JOIN을 통해 users 테이블을 참조하지만, 실제 삭제되는 것은 comments 테이블이다.

반응형

✅ 예제 2: 특정 기간에 주문한 상품의 재고 이력 삭제

DELETE i
FROM inventory_logs AS i
JOIN orders AS o ON i.order_id = o.id
WHERE o.order_date < '2023-01-01';

2023년 이전 주문에 해당하는 재고 로그를 정리하여, 불필요한 과거 이력 데이터를 효율적으로 제거할 수 있다.

✅ 예제 3: INNER JOIN 외에 LEFT JOIN과 함께 사용

DELETE u
FROM users AS u
LEFT JOIN orders AS o ON u.id = o.user_id
WHERE o.id IS NULL;

주문 내역이 없는 사용자만 삭제하는 예제이다.
LEFT JOIN을 활용하여 관계가 존재하지 않는 데이터 식별이 가능하다.

✅ 주의할 점: 다중 테이블 DELETE는 불가능

MySQL에서는 DELETE문에 JOIN을 사용할 때도, 단일 테이블만 삭제 대상이 될 수 있다.
DELETE t1, t2 FROM ... 형식은 일부 MySQL 버전에서는 허용되나, 대부분의 실무 환경에서는 다음과 같이 단일 삭제만 권장된다.

반응형

✅ DELETE + JOIN vs DELETE + 서브쿼리

DELETE FROM comments
WHERE user_id IN (
  SELECT id FROM users WHERE status = '탈퇴'
);

위와 같은 서브쿼리 방식은 JOIN보다 직관적이지만, 서브쿼리가 복잡하거나 다중 조건이 있는 경우 성능 저하가 발생할 수 있다.
이럴 때는 DELETE + JOIN이 더 효율적이다.

✅ 실무에서 자주 활용되는 패턴

  1. 탈퇴한 사용자의 연관 데이터 정리
  2. 특정 기간 이전 주문에 따른 후속 테이블 정리
  3. 다른 테이블과의 조건 연계로 불필요한 이력 제거

✅ 인덱스와 조합하면 성능이 극대화된다

JOIN 대상이 되는 테이블의 JOIN 조건 컬럼(예: user_id, order_id)에는 반드시 인덱스가 설정되어 있어야 한다.
인덱스가 없으면 조인이 느려지고, DELETE 쿼리도 비효율적으로 동작할 수 있다.

✅ 공식 문서 참고 링크

반응형