MySQL에서 NOT IN() 절을 사용하면 지정한 값에 해당하지 않는 행들만 선택적으로 삭제할 수 있습니다. 이 글에서는 예제 테이블을 만들고, 특정 학생 데이터를 제외한 나머지 행을 삭제하는 전체 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 학생 정보를 저장할 테이블을 생성합니다. AUTO_INCREMENT 속성으로 자동 증가되는 기본 키를 설정하고, 시작 값을 101로 지정합니다.
mysql> create table DemoTable1830 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20) )AUTO_INCREMENT=101; Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 다섯 명의 학생 레코드를 추가합니다.
mysql> insert into DemoTable1830(StudentName) values('Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1830(StudentName) values('David');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1830(StudentName) values('Mike');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1830(StudentName) values('Sam');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1830(StudentName) values('Bob');
Query OK, 1 row affected (0.00 sec)
3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1830;
실행 결과는 다음과 같습니다.
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 101 | Chris | | 102 | David | | 103 | Mike | | 104 | Sam | | 105 | Bob | +-----------+-------------+ 5 rows in set (0.00 sec)
4. NOT IN()으로 특정 행 제외 후 삭제
이제 핵심 쿼리입니다. WHERE 절과 NOT IN()을 조합하면 목록에 포함된 ID(101, 103, 105)를 제외한 나머지 행, 즉 102번 David과 104번 Sam의 데이터만 삭제됩니다.
mysql> delete from DemoTable1830
where StudentId NOT IN('101','103','105');
Query OK, 2 rows affected (0.00 sec)
5. 삭제 결과 확인
삭제가 정상적으로 처리되었는지 테이블을 다시 조회해 보겠습니다.
mysql> select * from DemoTable1830;
실행 결과는 다음과 같습니다.
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 101 | Chris | | 103 | Mike | | 105 | Bob | +-----------+-------------+ 3 rows in set (0.00 sec)
정리
위 예제처럼 DELETE 문에 NOT IN()을 활용하면 유지하고 싶은 행의 ID 목록만 지정해 두고, 그 외의 데이터를 한 번에 삭제할 수 있습니다. 반대로 IN()을 사용하면 목록에 포함된 행만 삭제할 수 있으니, 상황에 맞게 두 절을 활용하면 됩니다. 실무에서는 대량의 데이터를 삭제하기 전에 반드시 SELECT 문으로 먼저 대상 행을 확인한 후 삭제를 실행하는 것이 안전합니다.