내용
- SQL에서 null의 의미
- null과 three-valued logic !
- true, false 그리고 unkonown
- where 절과 three-valued logic의 관계
- not in 사용 시 주의 사항
employee 테이블이 있다고 합시다. 테이블에는 id, name, birth_date 등의 attribute가 있다고 하겠습니다.
이때 id가 14인 직원은 생일 정보를 기입하지 않아서 birth_date가 NULL이고
id가 15인 직원 또한 생일 정보가 누락돼서 birth_data가 NULL이라고 하겠습니다.
둘 다 생일 정보가 모두 NULL이니까 두 직원의 생일이 같다고 할 수 있을까요?
아닙니다. 같을수도 있지만 다를수도 있습니다.
때문에 SQL에서는 NULL 비교를 할 때 같다, 다르다를 단정지을 수 없습니다.
생일 정보가 NULL인 직원의 id를 가져오는 쿼리문
SELECT id FROM employee WHERE birth_data = NULL;
## 결과 ##
Empty set
생일 정보가 NULL인 직원의 id를 가져오는 쿼리문을 실행했더니 결과로 Empty가 나왔습니다. 그렇다면 생일 정보가 NULl인 직원은 없다고 할 수 있을까요?
아닙니다. 이런 문제가 있기 때문에 NULL은 '=' 비교 연산자를 사용하면 안됩니다.
NULL을 비교 연산하는 방법
SELECT id FROM employee WHERE birth_date IS NULL
NULL을 비교 연산하는 경우에는 '='가 아닌 'IS'를 사용해야합니다.
위 사진은 EMPLOYEE 테이블의 사진입니다.
이때 아래의 쿼리문을 실행한다고 합시다
SELECT * FROM employee where bitrh_data = '1990-03-09;
이 쿼리문은 생년월일이 1990년 03월 09일인 직원을 모두 조회하는 쿼리입니다. 그런데 여기서 질문이 있습니다
id가 14, 15인 직원은 생일을 비교하는 단계에서 True, False 둘 중에서 어떤 결과가 나올까요?
이전에서 언급한 것처럼 생일 정보가 NULL이기 때문에 생년월일이 1990년 03월 09일 일수도 있고 아닐수도 있습니다. 때문에 여기서 새로운 개념이 나옵니다.
UNKNOWN의 논리 연산 결과
WHERE절의 condition(s)
특히나 두번째 설명이 매우 중요합니다. WHERE 절의 결과가 FASLE인 것만 선택되지 않는 것이 아니라 결과가 UNKNOWN인 tuple도 선택되지 않습니다.
이 점을 정확히 알아야 예상치 못한 동작이 발생했을 때 대처가 가능합니다.
v NOT IN (v1, v2, v3)는 아래와 같은 의미이다.
만약 v1, v2, v3 중에 하나가 NULL이라면?
출처
글에 사용된 내용 및 사진은 모두 아래 영상의 자료입니다.
유튜브-쉬운코드
시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL