MySQL에서 특정 값을 제외하면서 NULL 값이 포함된 레코드까지 함께 조회해야 하는 경우가 종종 있습니다. 이때 NOT IN, OR, IS NULL 조건을 하나의 쿼리에 결합하면 원하는 결과를 얻을 수 있습니다.
SQL에서는 NULL과의 비교 연산이 항상 UNKNOWN으로 평가되기 때문에, 단순히 NOT IN만 사용하면 NULL 레코드가 결과에서 누락됩니다. 따라서 OR StudentName IS NULL 조건을 추가해 주어야 합니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable793(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(100)
);
Query OK, 0 rows affected (0.81 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 삽입합니다. 이때 의도적으로 NULL 값도 하나 포함시킵니다.
mysql> insert into DemoTable793(StudentName) values('Adam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable793(StudentName) values('Bob');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable793(StudentName) values(null);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable793(StudentName) values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable793(StudentName) values('Robert');
Query OK, 1 row affected (1.03 sec)3. 전체 레코드 확인하기
SELECT 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable793;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | Adam |
| 2 | Bob |
| 3 | NULL |
| 4 | Chris |
| 5 | Robert |
+-----------+-------------+
5 rows in set (0.00 sec)
4. NOT IN, OR, IS NULL을 결합한 쿼리 실행하기
다음은 하나의 MySQL 쿼리에서 NOT IN, OR, IS NULL을 함께 사용하여 'Chris'라는 이름을 가진 학생은 제외하되, 이름이 NULL인 학생은 포함시키는 쿼리입니다.
mysql> select *from DemoTable793 where StudentName NOT IN('Chris') OR StudentName IS NULL;실행 결과는 다음과 같습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | Adam |
| 2 | Bob |
| 3 | NULL |
| 5 | Robert |
+-----------+-------------+
4 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 'Chris'(StudentId 4)는 NOT IN('Chris') 조건에 의해 제외되었고, 나머지 레코드는 모두 정상적으로 조회된 것을 확인할 수 있습니다. 만약 OR StudentName IS NULL 조건이 없었다면 StudentId 3번(NULL) 레코드는 결과에 나타나지 않았을 것입니다.
이처럼 NOT IN 절과 함께 NULL 데이터를 다룰 때는 반드시 IS NULL 조건을 별도로 처리해야 정확한 결과를 얻을 수 있습니다.