NULL은 다음을 의미한다.
중요한 점은
NULL ≠ 0
NULL ≠ '' (빈 문자열)
NULL은 아예 값 자체가 존재하지 않는 상태다.
가장 많이 하는 실수.
SELECT *
FROM DOCTOR
WHERE TLNO = NULL;
이 조건은 항상 참이 되지 않는다.
NULL은 값이 없기 때문에 = 비교 자체가 성립하지 않는다.
SELECT *
FROM DOCTOR
WHERE TLNO IS NULL;
NULL이 아닌 경우:
SELECT *
FROM DOCTOR
WHERE TLNO IS NOT NULL;
NULL이 포함된 연산은 대부분 결과가 NULL이 된다.
SELECT 10 + NULL; -- 결과: NULL
SELECT NULL * 5; -- 결과: NULL
값이 없는데 계산할 수 없기 때문이다.
집계 함수는 NULL을 자동으로 제외한다.
예시 데이터:
| score |
|---|
| 100 |
| 90 |
| NULL |
SELECT AVG(score)
FROM exam;
결과는 95이다.
NULL은 계산에서 제외된다.
SELECT COUNT(*), COUNT(score)
FROM exam;
SELECT IFNULL(TLNO, '번호없음')
FROM DOCTOR;
NULL이면 '번호없음'으로 바꿔준다.
SELECT COALESCE(TLNO, '번호없음')
FROM DOCTOR;
SELECT COALESCE(NULL, NULL, 'A', 'B');
-- 결과: A
SELECT *
FROM EMP
WHERE salary > 3000;
salary가 NULL인 행은 비교 자체가 불가능하다.
TRUE도 FALSE도 아닌 UNKNOWN이 된다.
SQL은 3값 논리를 사용한다.
WHERE 절은 TRUE만 통과한다.
DBMS마다 다르지만, MySQL 기준:
명시적으로 제어하는 방법 (Oracle 등):
SELECT *
FROM EMP
ORDER BY salary DESC NULLS LAST;
LEFT JOIN에서 자주 발생한다.
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id;
매칭되지 않는 B의 컬럼은 NULL이 된다.
이때 다음 조건을 사용하면:
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL;
→ A에는 존재하지만 B에는 없는 데이터만 조회할 수 있다.
실무에서 매우 자주 쓰이는 패턴이다.
WHERE TLNO <> NULL;
WHERE TLNO IS NOT NULL;