NULL이란?
NULL은 값이 할당되지 않은(정해지지 않은) 미지의 값이다. NULL은 공백('')이나 스페이스 한칸(' ') 또는 0과는 다르게 값 자체가 없는 상태다.
NULL은 일반적인 값과는 처리 방법이 다르므로 주의가 필요하다. 아래는 회원(Member) 테이블에서, 가입일시(JoinDtm)가 2020년 5월 16일인 데이터를 조회하고 있다. 결과를 보면 LeaveDtm(탈퇴일시)의 값이 일부는 NULL로 채워져 있다.
-- [SQL-3-12-1]
SELECT T1.MemberId ,T1.JoinDtm ,T1.LeaveDtm
FROM startdb.Member T1
WHERE T1.JoinDtm = STR_TO_DATE('20200516','%Y%m%d')
ORDER BY T1.MemberId;
MemberId JoinDtm LeaveDtm
-------- ------------------- -------------------
M2156 2020-05-16 00:00:00 NULL
M2324 2020-05-16 00:00:00 NULL
M2338 2020-05-16 00:00:00 NULL
M2366 2020-05-16 00:00:00 NULL
M2380 2020-05-16 00:00:00 NULL
M2422 2020-05-16 00:00:00 NULL
M2436 2020-05-16 00:00:00 2021-08-05 00:00:00
SQL
복사
NULL인 데이터를 그대로 화면에 보여줄 수도 있지만, 아래와 같이 IFNULL 함수를 사용하면 NULL 값을 다른 값으로 치환할 수 있다. 아래는 IFNULL을 사용해 LeaveDtm이 NULL인 경우에는 '9999-12-31 00:00:00' 로 치환해서 출력하고 있다.
-- [SQL-3-12-2]
SELECT T1.MemberId ,T1.JoinDtm ,T1.LeaveDtm
,IFNULL(T1.LeaveDtm,'9999-12-31 00:00:00') 탈퇴일자 -- > NULL을 다른 값으로 치환
FROM startdb.Member T1
WHERE T1.JoinDtm = STR_TO_DATE('20200516','%Y%m%d')
ORDER BY T1.MemberId;
MemberId JoinDtm LeaveDtm 탈퇴일자
-------- ------------------- ------------------- -------------------
M2156 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2324 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2338 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2366 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2380 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2422 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2436 2020-05-16 00:00:00 2021-08-05 00:00:00 2021-08-05 00:00:00
SQL
복사
NULL은 특수한 값으로, NULL에 산술연산을 수행하면 결과는 항상 NULL이 된다. NULL과는 어떤 숫자를 더하거나 빼거나, 곱하거나 나누어도 결과는 항상 NULL이다.
-- [SQL-3-12-3]
SELECT NULL + 1 C1 ,0 + 1 C2 FROM DUAL;
C1 C2
---- --
NULL 1
SQL
복사
IS NULL
NULL인 데이터를 조회하기 위해 아래와 같이 동등조건(=)을 사용할 수 없다.
-- [SQL-3-12-4]
SELECT T1.MemberId ,T1.JoinDtm ,T1.LeaveDtm
,IFNULL(T1.LeaveDtm,'9999-12-31 00:00:00') 탈퇴일자
FROM startdb.Member T1
WHERE T1.JoinDtm = STR_TO_DATE('20200516','%Y%m%d')
AND T1.LeaveDtm = NULL
ORDER BY T1.MemberId;
Result
-------
No-Data
SQL
복사
NULL인 데이터를 조회하고 싶다면 아래와 같이 IS NULL 조건을 사용해야 한다.
-- [SQL-3-12-5]
SELECT T1.MemberId ,T1.JoinDtm ,T1.LeaveDtm
,IFNULL(T1.LeaveDtm,'9999-12-31 00:00:00') 탈퇴일자
FROM startdb.Member T1
WHERE T1.JoinDtm = STR_TO_DATE('20200516','%Y%m%d')
AND T1.LeaveDtm IS NULL -- >
ORDER BY T1.MemberId;
MemberId JoinDtm LeaveDtm 탈퇴일자
-------- ------------------- -------- -------------------
M2156 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2324 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2338 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2366 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2380 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
M2422 2020-05-16 00:00:00 NULL 9999-12-31 00:00:00
SQL
복사
만약에 NULL이 아닌 데이터를 조회하려면 IS NOT NULL을 사용하면 된다. NULL인 데이터를 조회하려고 머리를 써서 아래와 같이 IFNULL로 NULL 값을 치환해 조회할 수도 있다. 하지만 아래와 같은 방법은 SQL 성능을 고려했을 때 좋은 방법은 아니다.
-- [SQL-3-12-6]
SELECT T1.MemberId ,T1.JoinDtm ,T1.LeaveDtm
,IFNULL(T1.LeaveDtm,'9999-12-31 00:00:00') 탈퇴일자
FROM startdb.Member T1
WHERE T1.JoinDtm = STR_TO_DATE('20200516','%Y%m%d')
AND IFNULL(T1.LeaveDtm,'99991231') = '99991231' -- > 좋지 않은 방법 IS NULL로 바로 처리
ORDER BY T1.MemberId;
SQL
복사