0과 NULL은 '값이 없는' 것처럼 보이지만, SQL에서는 완전히 다른 개념으로 취급됩니다. 0은 유효한 값이지만, NULL은 **값이 없음(Unknown)**을 의미합니다. 이 차이는 SQLD 시험에서 가장 기본적인 함정으로 자주 출제됩니다.
| 구분 | 0 (숫자) | NULL |
|---|---|---|
| 의미 | 값이 존재함 | 값이 없음 (Unknown) |
| 데이터 타입 | 숫자형 데이터 | 모든 데이터 타입에 존재 가능 |
| 연산 | 정상적으로 연산 가능 | NULL이 포함된 연산은 결과도 NULL |
| 비교 | 일반 비교 연산자(=) 사용 | IS NULL 또는 **IS NOT NULL**만 사용 가능 |
| 집계 | COUNT, SUM 등 모든 집계 함수에 포함 | COUNT(컬럼), SUM 등에서 제외 |
NULL이 포함된 모든 연산의 결과는 NULL입니다.NULL + 10 = NULL, NULL * 5 = NULLNULL은 다른 어떤 값과도 비교할 수 없습니다. 따라서 WHERE col = NULL은 항상 FALSE를 반환합니다.WHERE col IS NULL, WHERE col IS NOT NULLCOUNT(*): 테이블의 모든 행을 카운트합니다. NULL 행을 포함합니다.COUNT(컬럼): 해당 컬럼에 NULL이 아닌 행만 카운트합니다. NULL 행을 제외합니다.COUNT(0): 0은 유효한 값이므로 COUNT(0)은 모든 행을 카운트합니다.COUNT(NULL): NULL은 값이 없으므로 **항상 0**을 반환합니다.SUM/AVG: NULL 값은 무시하고, NULL이 아닌 값들만 합산/평균을 계산합니다.0**은 있다, **NULL**은 없다.NULL**은 **모르는 값**이다. 모르는 값과 계산하면 결과도 모른다(NULL)!COUNT(별)**은 전체! **COUNT(컬럼)**은 NULL 빼고!1. 다음 중 NULL에 대한 설명으로 옳지 않은 것은?
A. NULL은 값이 없는 상태를 의미한다.
B. NULL은 0과 동일하게 취급된다.
C. NULL을 비교하기 위해서는 IS NULL을 사용해야 한다.
D. COUNT(컬럼) 함수는 NULL 값을 제외하고 개수를 센다.
2. 다음 SQL 실행 결과로 옳은 것은?
SELECT COUNT(*), COUNT(col), COUNT(NULL)
FROM Test;
(단, Test 테이블에는 총 5개의 행이 있으며, col 컬럼에는 3개의 유효한 값과 2개의 NULL이 있다.)
① 5, 5, 0
② 5, 3, 0
③ 5, 3, 2
④ 3, 2, 0
3. 다음 중 실행 결과가 NULL이 되는 것은?
A. SELECT 0 + 10;
B. SELECT NULL + 10;
C. SELECT 10 / 0; (Oracle 기준)
D. SELECT COUNT(*) FROM Users;
4. 다음 중 옳은 비교 구문을 모두 고른 것은?
ㄱ. WHERE score = 0
ㄴ. WHERE score IS NULL
ㄷ. WHERE score != NULL
ㄹ. WHERE score IS NOT NULL
① ㄱ, ㄴ
② ㄱ, ㄴ, ㄹ
③ ㄷ, ㄹ
④ ㄱ, ㄴ, ㄷ, ㄹ
NULL은 0과 다르게 '값이 없음'을 의미합니다. 0은 유효한 값입니다.COUNT(*)는 전체 행 수(5)를 셉니다.COUNT(col)은 NULL을 제외한 col의 유효한 값 개수(3)를 셉니다.COUNT(NULL)은 항상 0을 반환합니다.NULL과 연산하면 결과는 항상 NULL이 됩니다. C는 0으로 나누기 오류가 발생합니다.0은 값이므로 = 연산자로 비교 가능합니다.NULL은 IS NULL 또는 IS NOT NULL로만 비교해야 합니다.!= NULL은 올바르지 않은 구문입니다.