참고 - YouTube: 쉬운코드
unknown : 아직 알려지지 않았다는 뜻
unavailable or withheld : 보안상의 이유 등으로 정보를 공개하지 않아 DB에 저장되지 않았다는 뜻
not applicable : 아예 해당사항이 없다는 뜻
SQL에서 NULL
을 찾을 때 =
비교연산자를 사용하면 안됩니다.
예를 들어
SELECT id FROM employee WHERE birth_date = NULL;
위의 쿼리문을 작성한다면
Empty set (0.00 sec)
이러한 결과가 나오게 됩니다.
=
연산자 대신 IS
연산자를 사용해야 아래와 같은 결과가 나오게 됩니다.
SELECT id FROM employee WHERE birth_date IS NULL;
위의 내용을 이해하기 위해서 three-valued logic
에 대해 알아보겠습니다.
SQL에서 NULL과 비교 연산
을 하게 되면 그 결과는 UNKNOWN
이 됩니다.
UNKNOWN
은 True 일수도 있고 FALSE일 수도 있다
라는 의미입니다.
여기서 three-valued logic
은 비교/논리 연산의 결과로 3가지 상태,
즉, TRUE, FALSE, UNKNOWN
을 가진다는 뜻입니다.
위 표의 결과에 나오는 것처럼 NULL
과의 비교연산의 결과는 UNKNOWN
이 됩니다.
NULL
이 1일 수도, 1이 아닐 수도 있는 데이터이기 때문에 True, False 판단을 하지 못하는 것입니다.
TRUE, FALSE, UNKNOWN
의 AND, OR, NOT
연산의 결과는 아래와 같습니다.
TRUE
와 UNKNOWN
의 연산에서 UNKNOWN
이 True일지 False일지 알 수 없기
때문에 UNKNOWN
이라는 결과가 나오게 됩니다.
FALSE
와 UNKNOWN
의 연산에서 UNKNOWN
이 True일지 False일지 알 수 없기
때문에 UNKNOWN
이라는 결과가 나오게 됩니다.
WHERE 절
에서는 WHERE 절에 있는 조건의 결과가 TRUE인 tuple만 선택됩니다.
즉, 조건의 결과가 FALSE이거나 UNKNOWN 이라면 tuple은 선택되지 않습니다.
예를 들어
v NOT IN(v1, v2, v3)
은 아래와 같은 의미입니다.
v != v1 AND v! = v2 AND v != v3
만약 v1, v2, v3 중에 하나가 NULL 이어서 결과가 UNKNOWN이 된다면 해당 tuple은 선택되지 않습니다.