NULL 속성의 이해
쉽게 말하면
NULL은 '값이 비어 있음, 모름'이라는 뜻이에요. 0이나 빈칸 글자와는 달라요. 모르는 값에 10을 더해도 여전히 모르는 값이라서, NULL이 섞인 계산 결과는 NULL이 돼요. 그래서 NULL인지 확인할 때는 = 대신 IS NULL을 써요.
시험용 정의
NULL은 값이 없거나, 아직 정해지지 않았거나, 모르는 상태를 뜻한다. 숫자 0이나 공백 문자와 다르다. NULL이 들어간 산술 연산은 NULL, NULL과의 비교는 알 수 없음(UNKNOWN)이 되고, 집계 함수는 NULL을 빼고 계산한다. 모델링할 때 속성이 NULL을 허용할지 정해야 한다.
비유로 이해하기
설문지에서 '나이' 칸을 비워 둔 것과 같다. 0살이라고 쓴 게 아니라 안 쓴 것이다. 그 사람 나이에 10을 더해도 여전히 모른다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| UNKNOWN | 참도 거짓도 아닌 '알 수 없음'. NULL과 비교하면 나온다. WHERE는 참인 행만 남기므로 UNKNOWN인 행은 빠진다 |
| 집계 함수 | 여러 행을 모아 값 하나를 내는 함수. COUNT, SUM, AVG, MAX, MIN |
| NOT NULL | 열에 NULL을 허용하지 않는 제약조건 |
| DEFAULT | 값을 주지 않았을 때 대신 들어갈 기본값 |
NULL의 동작
| 상황 | 결과 | 예 |
|---|---|---|
| 산술 연산 | NULL | 3000 + NULL = NULL |
| 비교 (=, <>, >) | UNKNOWN → WHERE에서 걸러짐 | COMM = NULL은 어떤 행도 고르지 못한다 |
| NULL 확인 | IS NULL / IS NOT NULL만 쓴다 | COMM IS NULL |
| 집계 함수 | NULL을 빼고 계산 | SUM(COMM), AVG(COMM), COUNT(COMM) |
| COUNT(*) | NULL 여부와 상관없이 행 수 | COUNT(*) = 12, COUNT(COMM) = 3 |
| 문자 연결(Oracle ||) | NULL은 빈 문자열처럼 취급 | 'A' || NULL = 'A' |
AVG 함정
COMM이 (500, 0, 300, NULL)인 4명에서 AVG(COMM)은 NULL을 뺀 3명 평균 = 266.67이다. 4명 전체로 나눈 평균을 원하면 AVG(NVL(COMM, 0)) = 200 또는 SUM(COMM) / COUNT(*)를 쓴다. 시험에 자주 나오는 차이다.
모델링에서 NULL
- 반드시 있어야 하는 값(이름, 주문일)은 NOT NULL로 정한다. 주식별자는 존재성 때문에 NULL이 될 수 없다
- NULL이 많이 생기는 속성이 몰려 있다면 엔터티를 나누는 것(서브타입 분리)을 고려한다
- '값 없음'을 0이나 '없음' 같은 특정 값으로 대신하고 싶다면 DEFAULT를 정한다
- Oracle은 빈 문자열('')을 NULL로 저장한다. SQL Server는 ''와 NULL을 구분한다
시험에 이렇게 나와요
- NULL 산술 = NULL, NULL 비교 = UNKNOWN, IS NULL로만 확인
- COUNT(*)와 COUNT(열)의 차이, AVG(열)이 NULL을 빼고 나누는 것
- SUM(A+B)와 SUM(A)+SUM(B)의 차이 (행 단위 NULL 전파)
- Oracle에서 '' = NULL, 정렬 시 Oracle은 NULL을 가장 큰 값으로
출제 범위·공식 안내 기반
확인 문제
Q1. SAL 값이 3000이고 COMM 값이 NULL인 사원의 SAL + COMM 결과는?
- 3000
- NULL
- 오류
- 0
정답 보기
2번 NULL
NULL이 들어간 산술 연산의 결과는 NULL이다. NULL은 0이 아니라 '값을 모름'이라서 더해도 모르는 값이 된다. 0으로 보려면 SAL + NVL(COMM, 0)처럼 바꿔야 한다.
Q2. COMM 값이 (NULL, 100, NULL, 200)인 4행에서 COUNT(COMM), COUNT(*), AVG(COMM)을 차례로 쓴 것은?
- 2, 4, 150
- 4, 4, 75
- 2, 2, 75
- 4, 2, 150
정답 보기
1번 2, 4, 150
COUNT(COMM)은 NULL 제외 2, COUNT(*)는 행 수 4, AVG는 (100+200)/2 = 150.
Q3. A, B 열이 (1, NULL), (2, 3), (NULL, 4)인 3행에서 SUM(A + B)의 결과는?
- 10
- NULL
- 5
- 6
정답 보기
3번 5
행마다 먼저 더한다: NULL, 5, NULL. NULL을 빼고 합하면 5. SUM(A)+SUM(B) = 3+7 = 10과 다르다.
Q4. COMM이 NULL인 행을 찾는 올바른 조건은?
- COMM <> NULL
- COMM IS NULL
- COMM = NULL
- COMM = ''
정답 보기
2번 COMM IS NULL
NULL은 = 로 비교할 수 없다. IS NULL을 쓴다.
Q5. NULL + 10 의 결과는?
- NULL
- 10
- 0
- 오류
정답 보기
1번 NULL
NULL과의 산술 연산은 NULL이다.
Q6. Oracle에서 ORDER BY comm ASC 를 하면 COMM이 NULL인 행은?
- 결과에서 빠진다
- 오류
- 맨 앞
- 맨 뒤
정답 보기
4번 맨 뒤
Oracle은 NULL을 가장 큰 값으로 봐서 오름차순에서 맨 뒤다. SQL Server는 반대로 맨 앞.
헷갈리기 쉬운 O·X
NULL은 숫자 0과 같은 값이다.
정답 보기
X NULL은 값이 없거나 모르는 상태다. 0은 엄연한 값이다.
집계 함수 SUM, AVG, MAX는 NULL을 무시하고 계산한다.
정답 보기
O COUNT(*)만 NULL과 무관하게 행을 센다.
WHERE COMM <> 0 조건은 COMM이 NULL인 행도 결과에 포함한다.
정답 보기
X NULL과의 비교는 UNKNOWN이라 걸러진다.