MySQL NOT IN 연산자로 일부 행을 제외하고 삭제하기
MySQL에서 대량의 데이터를 다루다 보면 테이블의 모든 행을 지우되, 특정 값만 남겨두고 싶은 경우가 자주 발생합니다. 이럴 때 NOT IN 연산자를 사용하면 간단하게 해결할 수 있습니다.
기본 문법
삭제하지 않고 유지하고 싶은 행의 값을 NOT IN 뒤에 나열하면, 해당 값을 가진 행을 제외한 나머지 모든 행이 한 번에 삭제됩니다.
DELETE FROM yourTableName
WHERE yourColumnName NOT IN ('yourValue1', 'yourValue2', 'yourValue3', ...N);
실습 예제: 테이블 생성
먼저 실습용 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE deleteAllRowsWithCondition
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.84 sec)
테스트 데이터 삽입
INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다.
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('Larry');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('John');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('Sam');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('Bob');
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO deleteAllRowsWithCondition(Name) VALUES('David');
Query OK, 1 row affected (0.14 sec)현재 데이터 확인
SELECT 문으로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM deleteAllRowsWithCondition;
실행 결과는 다음과 같습니다.
+----+-------+
| Id | Name |
+----+-------+
| 1 | Larry |
| 2 | John |
| 3 | Sam |
| 4 | Mike |
| 5 | Carol |
| 6 | Bob |
| 7 | David |
+----+-------+
7 rows in set (0.00 sec)
총 7개의 행이 저장되어 있습니다.
NOT IN으로 조건부 삭제 실행
이제 'John', 'Mike', 'Carol' 세 행은 남겨두고, 나머지 행들을 모두 삭제해 보겠습니다.
mysql> DELETE FROM deleteAllRowsWithCondition WHERE Name NOT IN ('John','Mike','Carol');
Query OK, 4 rows affected (0.15 sec)4개의 행(Larry, Sam, Bob, David)이 성공적으로 삭제되었습니다.
삭제 결과 확인
다시 SELECT 문으로 테이블을 조회하여 삭제가 정상적으로 적용되었는지 확인합니다.
mysql> SELECT * FROM deleteAllRowsWithCondition;
실행 결과는 다음과 같습니다.
+----+-------+
| Id | Name |
+----+-------+
| 2 | John |
| 4 | Mike |
| 5 | Carol |
+----+-------+
3 rows in set (0.00 sec)
정리 및 주의사항
NOT IN 연산자를 사용하면 지정한 값 목록에 포함되지 않은 모든 행을 손쉽게 삭제할 수 있습니다. 실무에서 활용할 때는 다음 사항을 꼭 기억하세요.
- WHERE 절 필수: 조건 없이
DELETE를 실행하면 테이블의 모든 데이터가 삭제되므로 반드시 조건을 명시해야 합니다. - NULL 값 주의: 컬럼 값이
NULL인 경우NOT IN비교 결과가 항상 UNKNOWN으로 처리되어 해당 행이 삭제되지 않습니다. NULL 처리가 필요하다면IS NULL조건을 함께 사용하세요. - 백업 권장: 대량 삭제 작업 전에는 트랜잭션(
START TRANSACTION)을 사용하거나 백업을 통해 안전성을 확보하는 것이 좋습니다.