Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 특정 행만 남기고 나머지 행 전체 삭제하는 방법 (NOT IN 연산자 활용)

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)을 사용하거나 백업을 통해 안전성을 확보하는 것이 좋습니다.