MySQL에서 테이블의 데이터를 조회할 때 특정 값을 제외하고 싶다면 NOT IN() 연산자를 사용하면 됩니다. NOT IN()은 WHERE 절과 함께 사용되어 지정한 값 목록에 포함되지 않는 행만 반환합니다.
예제 테이블 생성
먼저 예제로 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable791 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName varchar(100) ); Query OK, 0 rows affected (0.61 sec)
데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable791(FirstName) values('Chris');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable791(FirstName) values('Robert');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable791(FirstName) values('David');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable791(FirstName) values('Mike');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable791(FirstName) values('Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable791(FirstName) values('Carol');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable791(FirstName) values('Adam');
Query OK, 1 row affected (0.09 sec)전체 레코드 확인
SELECT 문을 사용해 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable791;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 3 | David | | 4 | Mike | | 5 | Bob | | 6 | Carol | | 7 | Adam | +----+-----------+ 7 rows in set (0.00 sec)
NOT IN()으로 특정 값 제외하기
이제 NOT IN()을 사용하여 Id가 4, 5, 6인 레코드(Mike, Bob, Carol)를 제외한 나머지 데이터만 조회하는 쿼리입니다.
mysql> select *from DemoTable791 where Id NOT IN(4,5,6);
실행 결과는 다음과 같습니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 3 | David | | 7 | Adam | +----+-----------+ 4 rows in set (0.00 sec)
결과를 보면 Id가 4, 5, 6인 세 개의 레코드가 제외되고 나머지 4개의 레코드만 반환된 것을 확인할 수 있습니다.
참고 사항
NOT IN()은 편리하지만 몇 가지 주의할 점이 있습니다. 제외 목록에 NULL 값이 포함되면 비교 결과가 항상 UNKNOWN이 되어 어떤 행도 반환되지 않을 수 있습니다. 또한 대량의 데이터에서 성능이 중요하다면 LEFT JOIN ... IS NULL 방식이나 NOT EXISTS 서브쿼리를 대안으로 고려하는 것이 좋습니다.