DB

[MySQL] DELETE + 서브쿼리로 조건에 맞는 데이터만 정밀하게 삭제하는 방법

인생아 2025. 7. 2. 16:52
반응형

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는 대상이 존재하기만 하면 즉시 조건을 만족하기 때문에 성능 면에서 효율적일 수 있다.
조건이 복잡하거나 단순히 존재 여부만 확인하는 경우에 사용하면 좋다.

✅ 성능 최적화를 위한 팁

  1. 서브쿼리에서 사용하는 컬럼은 반드시 인덱스가 존재해야 한다
  2. 서브쿼리가 너무 크거나 복잡하면, 임시 테이블로 분리 후 삭제하는 방식이 더 효율적일 수 있다
  3. 트랜잭션(START TRANSACTION)을 통해 대량 삭제를 안전하게 수행할 수 있다
반응형

✅ 실무 활용 예

  • 이메일 차단 목록 기반 사용자 로그 정리
  • 구매 이력이 없는 고객 정보 삭제
  • 지정 기간 이전의 백업 로그 제거
  • 특정 조건의 관계형 데이터 정리

✅ DELETE + JOIN과 비교

DELETE + JOIN은 명시적인 관계를 직접 조인해서 삭제 대상 지정이 가능하지만,
DELETE + 서브쿼리는 더 유연한 필터링 조건 설정과 구조 분리에 강점이 있다.

서브쿼리는 복잡한 조건이나 여러 조건을 조합할 수 있기 때문에, 특히 비즈니스 로직이 다양한 서비스에서 실무에 자주 활용된다.

✅ 공식 문서 참고 링크

🏷️ 초강력 SEO 해시태그 추천

less
복사편집
#MySQL #MySQL서브쿼리 #MySQL삭제쿼리 #DELETEIN #DELETENOTIN #SQL서브쿼리 #MySQL실무쿼리 #데이터정리팁 #관계형DB삭제 #SQL최적화

MySQL

반응형