NULL 관련 함수
쉽게 말하면
NULL이 섞여 있으면 계산이 꼬이니까, NULL을 다른 값으로 바꿔 주는 함수들이 있어요. NVL은 '비어 있으면 이 값으로', COALESCE는 '앞에서부터 처음으로 값이 있는 것', NULLIF는 '두 값이 같으면 비워 둬'예요. 각 함수가 무엇을 돌려주는지 결과를 계산하는 문제가 자주 나와요.
시험용 정의
NULL이 섞인 값을 다루기 위한 함수들이다. NVL(a, b): a가 NULL이면 b, NVL2(a, b, c): a가 NULL이 아니면 b, NULL이면 c, NULLIF(a, b): a와 b가 같으면 NULL, COALESCE(a, b, c…): 처음으로 NULL이 아닌 값. SQL Server는 NVL 대신 ISNULL을 쓴다.
비유로 이해하기
빈칸 채우기 규칙이다. NVL은 "빈칸이면 0이라고 써", NVL2는 "썼으면 '있음', 비었으면 '없음'", COALESCE는 "휴대폰, 없으면 집 전화, 그것도 없으면 회사 전화"처럼 앞에서부터 처음 있는 연락처를 고른다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| NULL | 값이 없거나 모르는 상태. 산술 연산에 들어가면 결과도 NULL |
| 공집합 | 조건에 맞는 행이 하나도 없는 결과. NULL과 다르다. 행 자체가 없다 |
| 인수 | 함수 괄호 안의 값 |
NULL 함수 정리
| 함수 | 뜻 | 예 (COMM이 NULL / 500) |
|---|---|---|
| NVL(a, b) | a가 NULL이면 b, 아니면 a | NVL(comm, 0) → 0 / 500 |
| ISNULL(a, b) | SQL Server의 NVL | ISNULL(comm, 0) |
| NVL2(a, b, c) | a가 NULL이 아니면 b, NULL이면 c | NVL2(comm, 'Y', 'N') → N / Y |
| NULLIF(a, b) | a = b 이면 NULL, 아니면 a | NULLIF(comm, 0) → 0을 NULL로 |
| COALESCE(a, b, …) | 왼쪽부터 처음으로 NULL이 아닌 값 | COALESCE(comm, mgr, 0) |
자주 쓰는 모양
- 급여 + 수당 합계:
sal + NVL(comm, 0)(그냥sal + comm은 수당 없는 사람이 NULL) - 4명 전체 평균:
AVG(NVL(comm, 0))(그냥 AVG(comm)은 NULL을 빼고 나눈다) - 0으로 나누기 피하기:
a / NULLIF(b, 0)(b가 0이면 NULL로 바꿔 오류 대신 NULL) - COALESCE(a, b)는 NVL(a, b)와 같고, 인수를 여러 개 받을 수 있다
공집합과 NVL
SELECT NVL(sal, 0) FROM emp WHERE ename = '없는사람'은 행 자체가 없어서 아무 행도 안 나온다(공집합). NVL은 있는 행의 NULL 값만 바꿀 수 있다. 공집합일 때 값 하나를 받고 싶으면 집계 함수로 감싼다: SELECT NVL(MAX(sal), 0) FROM emp WHERE ename = '없는사람' → 0. 집계 함수는 행이 없어도 결과 한 행(NULL)을 돌려주기 때문이다.
시험에 이렇게 나와요
- NVL·NVL2·NULLIF·COALESCE 결과값 계산
- NVL2 인수 순서(있으면 둘째, 없으면 셋째)
- AVG(열) vs AVG(NVL(열, 0)) 차이
- 공집합에 NVL을 써도 행이 생기지 않음, 집계 함수로 감싸면 한 행
- Oracle NVL = SQL Server ISNULL
출제 범위·공식 안내 기반
확인 문제
Q1. NULLIF(sal, 2600)은 SAL이 2600일 때 무엇을 돌려줄까요?
- 2600
- 오류
- NULL
- 0
정답 보기
3번 NULL
NULLIF(a, b)는 두 값이 같으면 NULL, 다르면 a를 돌려준다. 그래서 2600인 행만 NULL이 된다.
Q2. SELECT COALESCE(NULL, NULL, 3, 4) FROM DUAL의 결과는?
- 3
- 7
- NULL
- 4
정답 보기
1번 3
왼쪽부터 처음으로 NULL이 아닌 값 3.
Q3. COMM이 NULL일 때 NVL2(comm, comm * 2, -1)의 결과는?
- 0
- NULL
- -1
- 오류
정답 보기
3번 -1
첫 인수가 NULL이므로 세 번째 값 -1.
Q4. 조건에 맞는 행이 없는 EMP 조회에서 결과로 0 한 행을 얻는 SQL은?
- SELECT ISNULL(sal) FROM emp WHERE empno = 9999
- SELECT NVL(MAX(sal), 0) FROM emp WHERE empno = 9999
- SELECT NULLIF(sal, 0) FROM emp WHERE empno = 9999
- SELECT NVL(sal, 0) FROM emp WHERE empno = 9999
정답 보기
2번 SELECT NVL(MAX(sal), 0) FROM emp WHERE empno = 9999
MAX는 행이 없어도 NULL 한 행을 돌려주므로 NVL로 0이 된다. 1번은 공집합(0행).
Q5. NULLIF(5, 5)의 결과는?
- 오류
- 5
- NULL
- 0
정답 보기
3번 NULL
두 값이 같으면 NULL, 다르면 첫 값이다.
Q6. SQL Server에서 Oracle의 NVL과 같은 함수는?
- ISNULL
- DECODE
- NULLIF
- NVL2
정답 보기
1번 ISNULL
ISNULL(a, b)는 a가 NULL이면 b다.
헷갈리기 쉬운 O·X
NULLIF(a, b)는 a가 NULL이면 b를 돌려준다.
정답 보기
X 그건 NVL이다. NULLIF는 a와 b가 같으면 NULL을 돌려준다.
COALESCE(a, b)는 NVL(a, b)와 같은 결과를 낸다.
정답 보기
O 인수가 둘일 때 같다. COALESCE는 인수를 여러 개 받을 수 있다.
NVL을 쓰면 조건에 맞는 행이 없을 때도 결과 행이 하나 생긴다.
정답 보기
X 행이 없으면(공집합) NVL을 적용할 대상도 없다.