공든탑앱 열기

NULL 관련 함수

SQLD (SQL 개발자) · SQL 기본 · 약 11분

쉽게 말하면

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, 아니면 aNVL(comm, 0) → 0 / 500
ISNULL(a, b)SQL Server의 NVLISNULL(comm, 0)
NVL2(a, b, c)a가 NULL이 아니면 b, NULL이면 cNVL2(comm, 'Y', 'N') → N / Y
NULLIF(a, b)a = b 이면 NULL, 아니면 aNULLIF(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)을 돌려주기 때문이다.

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. NULLIF(sal, 2600)은 SAL이 2600일 때 무엇을 돌려줄까요?

  1. 2600
  2. 오류
  3. NULL
  4. 0
정답 보기

3번 NULL

NULLIF(a, b)는 두 값이 같으면 NULL, 다르면 a를 돌려준다. 그래서 2600인 행만 NULL이 된다.

Q2. SELECT COALESCE(NULL, NULL, 3, 4) FROM DUAL의 결과는?

  1. 3
  2. 7
  3. NULL
  4. 4
정답 보기

1번 3

왼쪽부터 처음으로 NULL이 아닌 값 3.

Q3. COMM이 NULL일 때 NVL2(comm, comm * 2, -1)의 결과는?

  1. 0
  2. NULL
  3. -1
  4. 오류
정답 보기

3번 -1

첫 인수가 NULL이므로 세 번째 값 -1.

Q4. 조건에 맞는 행이 없는 EMP 조회에서 결과로 0 한 행을 얻는 SQL은?

  1. SELECT ISNULL(sal) FROM emp WHERE empno = 9999
  2. SELECT NVL(MAX(sal), 0) FROM emp WHERE empno = 9999
  3. SELECT NULLIF(sal, 0) FROM emp WHERE empno = 9999
  4. 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)의 결과는?

  1. 오류
  2. 5
  3. NULL
  4. 0
정답 보기

3번 NULL

두 값이 같으면 NULL, 다르면 첫 값이다.

Q6. SQL Server에서 Oracle의 NVL과 같은 함수는?

  1. ISNULL
  2. DECODE
  3. NULLIF
  4. 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을 적용할 대상도 없다.

함께 보면 좋은 개념