unknown (알려지지 않음) - 생일
unavailable or withheld (공개 하지 않음) - 민감한 정보
not applicable (해당 사항 없음) - 집전화 없는 경우
-> 생일 열(row)이 null로 되어 있을때 어떤 두사람을 같다(==), 다르다(!=)로 처리하면 안된다. 그렇기에 sql에서는 같다 다르다로 단정 지을 수 없다.
-> SELECT id FROM employee WHERE birth_date = null; -> Empty set 출력
-> SELECT id FROM employee WHERE birth_date IS null; -> 해당 되는 id 출력
three-valued logic : 비교/논리 연산의 결과 TRUE,FALSE, UNKNOWN을 가진다.
null과 비교연산을 수행할 경우 unknown이 나오게 된다.
where 절에 있는 conditions의 결과가 True인 튜플만 선택된다.
and 연산의 FALSE 연산 OR 연산의 TRUE 연산이 기존 알고 있던 예상되로 출력되고 나머지는 예상외의 unknown이 출력 될 수 있다. not연산도 unknown은 unknown이 출력되므로 주의해야 한다.(True와 false 중 어떤 값인지 모르기 때문)
NOT IN 사용 시 주의
SELECT D.id, D.name
FROM department AS D
WHERE D.id NOT IN(
SELECT E.dept.ID
FROM employee E
WHERE E.birth_date >= '2000-01-01'
);
-NOT IN 은 and 연산으로서 하나에 값이라도 있을경우 false가 출력되는데 이때 birth_date 테이블 열에 null이 저장되어 있을경우 unknown이 출력되므로 이 sql문은 결과적으로 unknown 혹은 false만 출력된다.
SELECT D.id, D.name
FROM department AS D
WHERE D.id NOT EXISTS(
SELECT E.dept.ID
FROM employee E
WHERE E.birth_date >= '2000-01-01'
);