NULL이 있으면 '<>' 연산자가 작동하지 않는 이유
SQL에서 NULL은 '값이 없음', 즉 알 수 없는 값(unknown)을 의미하는 특수한 상태입니다. 그렇기 때문에 <> (같지 않음) 연산자로 NULL과 비교하면 TRUE나 FALSE가 아닌 NULL이 반환되며, WHERE 절에서 NULL로 평가된 행은 결과에서 자동으로 제외됩니다.
따라서 NULL이 포함된 데이터를 다룰 때는 일반 비교 연산자만 사용해서는 안 되며, 반드시 IS NOT NULL 또는 IS NULL 연산자를 함께 사용해야 합니다.
기본적인 문법은 다음과 같습니다.
SELECT *FROM yourTableName where yourColumnName1 is not null or yourColumnName2 <> anyIntegerValue;
NULL이 포함된 상태에서 '같지 않음' 조건이 어떻게 동작하는지 실제 테이블을 만들어 확인해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table IsNullDemo
-> (
-> ProductId int,
-> ProductName varchar(100),
-> ProductBackOrder int
-> );
Query OK, 0 rows affected (0.54 sec)
다음으로 NULL 값을 포함한 레코드를 여러 개 삽입합니다. 레코드 삽입 쿼리는 다음과 같습니다.
mysql> insert into IsNullDemo values(100,'First-Product',null);
Query OK, 1 row affected (0.14 sec)
mysql> insert into IsNullDemo values(101,'Second-Product',2);
Query OK, 1 row affected (0.22 sec)
mysql> insert into IsNullDemo values(102,'Third-Product',null);
Query OK, 1 row affected (0.20 sec)
mysql> insert into IsNullDemo values(103,'Fourth-Product',4);
Query OK, 1 row affected (0.17 sec)
mysql> insert into IsNullDemo values(104,'Fifth-Product',10);
Query OK, 1 row affected (0.17 sec)
mysql> insert into IsNullDemo values(105,'Sixth-Product',null);
Query OK, 1 row affected (0.20 sec)
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from IsNullDemo;
실행 결과는 다음과 같습니다.
+-----------+----------------+------------------+
| ProductId | ProductName | ProductBackOrder |
+-----------+----------------+------------------+
| 100 | First-Product | NULL |
| 101 | Second-Product | 2 |
| 102 | Third-Product | NULL |
| 103 | Fourth-Product | 4 |
| 104 | Fifth-Product | 10 |
| 105 | Sixth-Product | NULL |
+-----------+----------------+------------------+
6 rows in set (0.00 sec)
케이스 1: NULL인 행을 제외하고 조회하기
NULL이 포함된 행을 결과에서 제외하고 싶다면 IS NOT NULL 연산자를 사용합니다. 쿼리는 다음과 같습니다.
mysql> select *from IsNullDemo
-> where ProductBackOrder is not null or ProductBackOrder <> 2;
실행 결과는 다음과 같습니다.
+-----------+----------------+------------------+
| ProductId | ProductName | ProductBackOrder |
+-----------+----------------+------------------+
| 101 | Second-Product | 2 |
| 103 | Fourth-Product | 4 |
| 104 | Fifth-Product | 10 |
+-----------+----------------+------------------+
3 rows in set (0.03 sec)
위 결과에서 확인할 수 있듯이 ProductBackOrder가 NULL인 행은 모두 제외되고, 실제 값이 존재하는 행만 출력되었습니다.
케이스 2: NULL인 행도 포함해서 조회하기
반대로 NULL인 행도 결과에 포함하고 싶다면, 즉 'NULL이거나 2가 아닌 값'을 모두 조회하려면 IS NULL 개념을 활용해야 합니다. 쿼리는 다음과 같습니다.
mysql> select *from IsNullDemo
-> where ProductBackOrder is null or ProductBackOrder <> 2;
실행 결과는 다음과 같습니다.
+-----------+----------------+------------------+
| ProductId | ProductName | ProductBackOrder |
+-----------+----------------+------------------+
| 100 | First-Product | NULL |
| 102 | Third-Product | NULL |
| 103 | Fourth-Product | 4 |
| 104 | Fifth-Product | 10 |
| 105 | Sixth-Product | NULL |
+-----------+----------------+------------------+
5 rows in set (0.00 sec)
정리
NULL은 = , <> 등의 일반 비교 연산자로 비교할 수 없으며, 비교 결과는 항상 NULL(알 수 없음)이 됩니다. 따라서 NULL 여부를 판단할 때는 반드시 IS NULL 또는 IS NOT NULL 연산자를 사용해야 하며, OR 조건과 함께 조합하면 원하는 조회 결과를 정확하게 얻을 수 있습니다.