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이 더 효율적이다.
✅ 실무에서 자주 활용되는 패턴
- 탈퇴한 사용자의 연관 데이터 정리
- 특정 기간 이전 주문에 따른 후속 테이블 정리
- 다른 테이블과의 조건 연계로 불필요한 이력 제거
✅ 인덱스와 조합하면 성능이 극대화된다
JOIN 대상이 되는 테이블의 JOIN 조건 컬럼(예: user_id, order_id)에는 반드시 인덱스가 설정되어 있어야 한다.
인덱스가 없으면 조인이 느려지고, DELETE 쿼리도 비효율적으로 동작할 수 있다.
✅ 공식 문서 참고 링크
'DB' 카테고리의 다른 글
[MySQL] DELETE + NULL 조건으로 누락 데이터 정리하기 🧹 (0) | 2025.07.02 |
---|---|
[MySQL] DELETE + 트랜잭션 처리로 안전한 데이터 삭제 구현하기 🔐 (0) | 2025.07.02 |
[MySQL] DELETE + EXISTS / IN 조건으로 정밀하고 안전하게 데이터 삭제하기 ✂️ (0) | 2025.07.02 |
[MySQL] DELETE + 서브쿼리로 조건에 맞는 데이터만 정밀하게 삭제하는 방법 (0) | 2025.07.02 |
[MySQL] DELETE + LIMIT / ORDER BY로 원하는 개수만 안전하게 삭제하는 방법 (2) | 2025.07.02 |
[MySQL] DELETE + WHERE 조건으로 안전하게 데이터 삭제하는 방법 총정리 (0) | 2025.07.02 |
[MySQL] DELETE 기본 문법 총정리 – 안전하게 데이터 삭제하는 법 (1) | 2025.07.02 |
[MySQL] UPDATE 실패 원인과 해결법 완전 정복 – 수정이 안될 때 확인할 모든 것 (2) | 2025.07.01 |