1. 정의
'값이 존재하지 않음' 을 뜻한다.'값이 존재하지 않는다. ' 라는 것은 다른 말로 '해당 값이 무엇인지 알지 못한다. (
unknown)' 을 의미한다. 따라서 employees 테이블에서 직원 A의 생년월일이 미기입 상태이면, 아직 해당 직원의 생년월일을 알지 못하는 상태임으로 NULL로 표기된다.(1) TVL (Three-Valued-Logic)
NULL의 존재로 인해 SQL문법은 TVL의 특징을 가진다. TVL은 Three-Valued-Logic의 약자로, 논리 연산 결과로 3가지가 존재함을 의미한다. 나올 수 있는 결과에는
True, False, Unknown 이 있다.True: 논리 연산 결과가 참이다.
False: 논리 연산 결과가 거짓이다.
UnKnown: 논리 연산 결과가 참인지 거짓인지 판단할 수 없다.
Unknown 판정은 NULL이 논리 연산에 포함될 때 일어난다.
직원 테이블에 A와 B 사원의 생년월일이 미기입 상태라고 가정해보자. 그렇다면 DB에는 두 직원의 생년월일이 NULL로 기입되어 있을 것이다. 둘 모두 NULL로 기입되어 있다고 해서 둘의 생년월일이 같은 것을 의미하지 않는다. 둘의 생년월일이 같은지 아닌지 모른다에 가까울 것이다. 이때 연산의 결과는
Unknown, 즉 ‘알 수 없음’으로 도출된다.2. 연산
위와 같은 가계부 DB에서 연산을 진행한다고 가정해보자.
(1) 인스턴스의 속성값이 NULL인지 조회 (= NULL vs IS NULL)
인스턴스의 속성값이 NULL 인지 아닌지를 찾기 위한 쿼리문을 짠다고 가정해보자.
A. = NULL
SELECT * FROM 가계부 WHERE 수입 = NULL
해당 문법은 '수입이 알 수 없는 값과 같은지' 를 뜻한다. 즉 논리상 성립되지 않는 연산이다. 좌항에 어떤 값이 들어와도 NULL 자체와 동등비교를 하므로 결과는 항상
Unknown이 나올 것이다.SQL문은 전체에서 WHERE 절의 결과가 true인 인스턴스만 남기는데, 위의 쿼리문은 모든 행에서 논리 결과가 Unknown이 나오므로 어떠한 결과도 반환하지 않는다.
B. IS NULL
해당 문법은 '특정 인스턴스의 속성값이 NULL인지 아닌지'를 확인해주는 약속된 명령어이다.
SELECT * FROM 가계부 WHERE 수입 IS NULL
따라서 수입이 NULL인 '이로운' 이란 회원의 인스턴스가 반환될 것이다.
(2) 동일 인스턴스 내의 속성들 사이의 연산 (가로 연산)
동일 인스턴스 내의 속성값들을 피연산자로 하여 연산할 때, 해당 연산에 NULL이 포함되어 있을 경우, 결과값은 항상 NULL 이다. 왜냐하면 알 수 없는 값이 연산에 포함되어 있으면 계산 자체를 실행할 수 없기 때문이다.
SELECT (수입 - 지출) as "잔여금액" FROM 가계부 WHERE 이름 = '이로운'
위 SELECT 문의 연산은 위와 같이 가로로 진행될 것이다.
해당 연산에 NULL이 포함되어 있으므로 결과값 또한 NULL이 나온다.
해당 연산에 NULL이 포함되어 있으므로 결과값 또한 NULL이 나온다.
(3) 다른 인스턴스의 동일한 속성과의 연산 (세로 연산)
모든 인스턴스의 동일 속성에 대한 연산이 진행될 떄, NULL 값인 행이 있을 경우, 해당 NULL 값인 행을 제외하고 연산한다. Where 절에서 Unknown은 결과집합에 포함시키지 않는 것처럼, NULL인 값은 전체 통계에서 뺀다.
SELECT AVG(수입) as '수입 평균' FROM 가계부
해당 SQL문의 결과는 다음과 같다.
수입 평균 |
50,000 |
이로운의 수입은 NULL이므로, 평균 계산을 위한 분모와 분자 모두에서 빠진다. 다른 집계함수에서 또한 마찬가지 이다.
부록
A. 모르는 것 정리
B. 참고 문서
- 유선배이 SQLD 노트
⬅️ 이전 글
➡️ 다음 글