MySQL에서 NULL 값이 포함된 필드 조회하기
SELECT 문으로 NULL 값을 확인하려면 MySQL의 IS NULL 연산자를 사용해야 합니다. 일반적인 비교 연산자(<>, =)만으로는 NULL인 행을 찾을 수 없는데, 이는 NULL과의 비교 결과가 TRUE나 FALSE가 아닌 '알 수 없음(NULL)'이 되기 때문입니다. 먼저 예제 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1455
-> (
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.47 sec)테스트 데이터 삽입하기
insert 명령을 사용해 세 가지 형태의 데이터를 삽입합니다. 일반 문자열, NULL, 그리고 빈 문자열('')입니다.
mysql> insert into DemoTable1455 values('John');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1455 values(NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1455 values('');
Query OK, 1 row affected (0.19 sec)전체 데이터 확인하기
select 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1455;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+ | Name | +------+ | John | | NULL | | | +------+ 3 rows in set (0.00 sec)
NULL 값을 포함해 조회하는 쿼리
NULL 값이 포함된 필드를 대상으로 SELECT를 수행하려면 다음과 같이 IS NULL 조건을 함께 사용합니다.
mysql> select * from DemoTable1455 where Name <> 'John' or Name is null;
실행 결과는 다음과 같습니다.
+------+ | Name | +------+ | NULL | | | +------+ 2 rows in set (0.00 sec)
왜 IS NULL이 필요한가?
MySQL에서 NULL은 '값이 없음'을 나타내는 특수한 상태입니다. 따라서 Name <> 'John' 조건만 단독으로 사용하면 NULL인 행은 결과에 포함되지 않습니다. NULL과의 모든 비교 연산은 TRUE도 FALSE도 아닌 NULL을 반환하기 때문에 WHERE 절의 조건을 만족하지 못하게 됩니다. 그래서 NULL 여부를 판별할 때는 반드시 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
NULL과 빈 문자열('')의 차이
예제 결과에서 알 수 있듯이 NULL과 빈 문자열은 서로 다른 값입니다. 빈 문자열은 실제로 저장된 길이 0짜리 문자열이며, NULL은 값 자체가 존재하지 않음을 의미합니다. 위 쿼리에서 두 값이 모두 반환된 이유는 Name <> 'John' 조건이 빈 문자열 행에 대해 참이 되고, Name is null 조건이 NULL 행을 걸러주기 때문입니다.