NOT IN을 활용한 조건부 레코드 삭제 방법
MySQL에서 특정 레코드 몇 개만 남기고 나머지를 모두 삭제해야 하는 경우가 종종 있습니다. 이럴 때 NOT IN 연산자를 사용하면 유지하고 싶은 값만 지정하여 나머지 레코드를 한 번에 간편하게 삭제할 수 있습니다.
이번 글에서는 예제 테이블을 만들고, NOT IN 연산자를 활용해 원하는 레코드만 남기는 과정을 단계별로 살펴보겠습니다.
1단계: 테이블 생성하기
먼저 아래와 같이 예제용 테이블을 생성합니다.
mysql> create table DemoTable
(
FirstName varchar(100)
);
Query OK, 0 rows affected (0.65 sec)2단계: 레코드 삽입하기
INSERT 명령어를 사용해 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('Chris');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('Robert');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Mike');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('David');
Query OK, 1 row affected (0.12 sec)3단계: 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+ | FirstName | +-----------+ | Chris | | Robert | | Mike | | Sam | | David | +-----------+ 5 rows in set (0.00 sec)
현재 총 5개의 레코드가 저장되어 있습니다.
4단계: NOT IN으로 특정 레코드를 제외하고 삭제하기
이제 핵심 단계입니다. 아래 쿼리처럼 NOT IN 절에 유지할 값('Robert', 'Mike')을 지정하면, 해당 값에 포함되지 않는 나머지 레코드가 모두 삭제됩니다.
mysql> delete from DemoTable where FirstName NOT IN('Robert', 'Mike');
Query OK, 3 rows affected (0.17 sec)쿼리 실행 결과 3개의 행이 삭제되었습니다. 즉, 'Chris', 'Sam', 'David' 레코드가 제거된 것입니다.
5단계: 삭제 후 결과 확인하기
테이블을 다시 조회하여 삭제가 정상적으로 적용되었는지 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+ | FirstName | +-----------+ | Robert | | Mike | +-----------+ 2 rows in set (0.00 sec)
마무리 정리
위 예제에서 확인했듯이, DELETE 문과 NOT IN 연산자를 함께 사용하면 유지하려는 값만 명시하고 나머지 레코드를 손쉽게 삭제할 수 있습니다. 반대로 IN 연산자를 사용하면 지정한 값만 선택적으로 삭제할 수 있으므로, 상황에 맞게 두 연산자를 활용하면 됩니다.
다만 실무 환경에서는 삭제 작업 실행 전 반드시 SELECT 문으로 대상 레코드를 먼저 확인하고, 중요한 데이터라면 백업을 진행한 후 삭제하는 것이 안전합니다.