반응형
MySQL에서 데이터를 삭제할 때, 복잡한 조건을 만족하는 행만 선별해서 제거하고 싶을 때가 많다.
이럴 때 유용하게 사용할 수 있는 것이 바로 DELETE + 서브쿼리(하위 쿼리)이다.
특정 조건을 만족하는 ID, 날짜, 관계 키를 서브쿼리로 선별하여 외부 DELETE 문과 결합하면, 데이터 정합성을 유지하면서도 불필요한 데이터를 효과적으로 정리할 수 있다.

✅ DELETE + IN 서브쿼리 기본 문법
DELETE FROM 테이블명
WHERE 컬럼명 IN (
SELECT 컬럼명 FROM 다른_테이블 WHERE 조건
);
서브쿼리를 통해 삭제 대상이 되는 특정 컬럼의 값 목록을 추출하고, 이를 기반으로 외부 DELETE에서 해당 레코드를 삭제한다.
✅ 예제 1: 탈퇴한 유저의 댓글 삭제
DELETE FROM comments
WHERE user_id IN (
SELECT id FROM users WHERE status = '탈퇴'
);
users 테이블에서 status가 '탈퇴'인 사용자의 ID만 추출하고, 그 ID를 기준으로 comments 테이블에서 댓글을 삭제하는 구조이다.
반응형
✅ 예제 2: 특정 날짜 이전 주문과 관련된 배송 이력 삭제
DELETE FROM deliveries
WHERE order_id IN (
SELECT id FROM orders WHERE order_date < '2023-01-01'
);
과거 주문 기록과 연계된 배송 이력만 정리하고 싶을 때 자주 쓰는 패턴이다.
✅ 예제 3: NOT IN 서브쿼리로 제외된 값만 삭제
DELETE FROM sessions
WHERE user_id NOT IN (
SELECT id FROM users WHERE is_active = 1
);
현재 활성화된 유저가 아닌 사용자들의 세션을 제거하는 방식이다.
단, NOT IN을 사용할 경우 NULL 값에 주의해야 한다.
✅ EXISTS를 활용한 서브쿼리 삭제
DELETE FROM temp_users tu
WHERE EXISTS (
SELECT 1 FROM banned_users bu WHERE tu.email = bu.email
);
EXISTS는 대상이 존재하기만 하면 즉시 조건을 만족하기 때문에 성능 면에서 효율적일 수 있다.
조건이 복잡하거나 단순히 존재 여부만 확인하는 경우에 사용하면 좋다.
✅ 성능 최적화를 위한 팁
- 서브쿼리에서 사용하는 컬럼은 반드시 인덱스가 존재해야 한다
- 서브쿼리가 너무 크거나 복잡하면, 임시 테이블로 분리 후 삭제하는 방식이 더 효율적일 수 있다
- 트랜잭션(START TRANSACTION)을 통해 대량 삭제를 안전하게 수행할 수 있다
반응형
✅ 실무 활용 예
- 이메일 차단 목록 기반 사용자 로그 정리
- 구매 이력이 없는 고객 정보 삭제
- 지정 기간 이전의 백업 로그 제거
- 특정 조건의 관계형 데이터 정리
✅ DELETE + JOIN과 비교
DELETE + JOIN은 명시적인 관계를 직접 조인해서 삭제 대상 지정이 가능하지만,
DELETE + 서브쿼리는 더 유연한 필터링 조건 설정과 구조 분리에 강점이 있다.
서브쿼리는 복잡한 조건이나 여러 조건을 조합할 수 있기 때문에, 특히 비즈니스 로직이 다양한 서비스에서 실무에 자주 활용된다.
✅ 공식 문서 참고 링크
🏷️ 초강력 SEO 해시태그 추천
less
복사편집
#MySQL #MySQL서브쿼리 #MySQL삭제쿼리 #DELETEIN #DELETENOTIN #SQL서브쿼리 #MySQL실무쿼리 #데이터정리팁 #관계형DB삭제 #SQL최적화
MySQL
반응형
'DB' 카테고리의 다른 글
| [MySQL] DELETE + JSON 조건으로 JSON 데이터 기반 삭제 처리하기 (0) | 2025.07.02 |
|---|---|
| [MySQL] DELETE + NULL 조건으로 누락 데이터 정리하기 🧹 (0) | 2025.07.02 |
| [MySQL] DELETE + 트랜잭션 처리로 안전한 데이터 삭제 구현하기 🔐 (0) | 2025.07.02 |
| [MySQL] DELETE + EXISTS / IN 조건으로 정밀하고 안전하게 데이터 삭제하기 ✂️ (0) | 2025.07.02 |
| [MySQL] DELETE + JOIN으로 두 테이블 이상에서 조건에 맞는 데이터 안전하게 삭제하는 방법 (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 |