DBMS/개념

14_ NULL과 NVL() 함수

seungwon-1 2025. 10. 5. 14:23

SQL에서 자주 마주치는 NULL 값과 이를 처리하기 위한 NVL, NVL2 함수에 대해 정리해봤다.


데이터를 다루다 보면, 값이 없는 경우(누락값, 미입력 등)가 굉장히 많다. 이때 NULL을 올바르게 이해하고 처리하지 않으면,
의도치 않은 연산 결과가 나오거나 조건문이 제대로 작동하지 않을 수 있다.

 

 

1. NULL의 개념과 특징

1.1 NULL의 정의

  • NULL은 "값이 존재하지 않음"을 의미한다.
  • 숫자 0이나 빈 문자열('')과는 전혀 다르다.
    • 0은 “값이 0이다”
    • ''는 “문자열이 비어 있다”
    • NULL은 “값을 모른다” 또는 “아예 존재하지 않는다”는 의미

예를 들어, 다음과 같은 테이블이 있다고 하자.

CREATE TABLE students (
    student_id NUMBER,
    name VARCHAR2(50),
    score NUMBER
);

INSERT INTO students VALUES (1, '철수', 90);
INSERT INTO students VALUES (2, '영희', NULL);
INSERT INTO students VALUES (3, '민수', 80);

여기서 영희의 점수는 NULL이다.
즉, “점수를 알 수 없다”는 뜻이지 0점이 아니다.

 

 

1.2 NULL의 연산 특성

  • NULL과의 모든 연산 결과는 NULL이다.
SELECT 10 + NULL FROM dual;      -- 결과: NULL
SELECT 'A' || NULL FROM dual;    -- 결과: NULL

NULL과의 비교는 항상 거짓이다.

SELECT * FROM students WHERE score = NULL;   -- 결과 없음

NULL은 비교 불가능한 값이므로, 비교 연산자(=, != 등)로 확인할 수 없다.
대신 IS NULL 또는 IS NOT NULL을 사용해야 한다.

 

1.3 NULL 확인 방법

-- 점수가 없는 학생 조회
SELECT * FROM students WHERE score IS NULL;

-- 점수가 있는 학생 조회
SELECT * FROM students WHERE score IS NOT NULL;

 

2. NVL 함수

2.1 NVL의 정의

NULL 값을 다른 값으로 대체해주는 함수이다.

  • 기본 구문
NVL(expr1, expr2)
  • 동작 방식
    • expr1이 NULL이면 expr2 반환
    • expr1이 NULL이 아니면 expr1 반환

 

2.2 예제 1

SELECT name,
       NVL(score, 0) AS final_score
FROM students;
namescorefinal_score
철수 90 90
영희 NULL 0
민수 80 80

영희의 score는 NULL이라 0으로 대체된다.

 

2.3 예제 2 - 평균 계산

-- NULL은 평균에서 제외됨
SELECT AVG(score) FROM students;        -- 결과: (90 + 80) / 2 = 85

-- NVL을 사용해 NULL을 0으로 처리
SELECT AVG(NVL(score, 0)) FROM students;  -- 결과: (90 + 0 + 80) / 3 = 56.6

어떤 방식이 맞는지는 상황에 따라 다르다.
NULL을 0으로 간주할지, 제외할지는 목적에 따라 달라진다.

 

2.4 주의할 점

NVL 함수의 두 인수는 같은 데이터 타입이어야 한다.

NVL(salary, '0')  -- 오류 발생 (salary는 숫자, '0'은 문자열)
NVL(salary, 0)    -- 올바른 사용

 

3. NVL2 함수

3.1 NVL2의 정의

NULL 여부에 따라 다른 값을 반환하는 함수이다.

  • 기본 구문
NVL2(expr1, expr2, expr3)
  • 동작 방식
    • expr1이 NULL이 아니면 expr2 반환
    • expr1이 NULL이면 expr3 반환

 

3.2 예제 1

SELECT name,
       NVL2(score, '성적 있음', '성적 없음') AS status
FROM students;
namescorestatus
철수 90 성적 있음
영희 NULL 성적 없음
민수 80 성적 있음

NULL 여부에 따라 상태를 다르게 표시할 수 있다.

 

3.3 예제 2 - 급여 계산

SELECT employee_name,
       salary,
       commission_pct,
       NVL2(commission_pct, salary * (1 + commission_pct), salary) AS total_salary
FROM employees;
employee_namesalarycommission_pcttotal_salary
홍길동 3000 0.1 3300
김영희 2500 NULL 2500

commission_pct가 존재하면 보너스를 포함한 급여를 계산하고,
NULL이면 기본급만 반환한다.

 

활용 요약

함수설명예시
NVL(expr1, expr2) expr1이 NULL이면 expr2 반환 NVL(score, 0)
NVL2(expr1, expr2, expr3) expr1이 NULL이 아니면 expr2, NULL이면 expr3 NVL2(score, '있음', '없음')

 

핵심 요약

  • NULL은 “값이 없다”는 의미이며, 0이나 공백과 다르다.
  • NULL은 비교 불가능하므로 IS NULL, IS NOT NULL을 사용한다.
  • NVL()은 NULL을 다른 값으로 대체한다.
  • NVL2()는 NULL 여부에 따라 다른 값을 반환한다.
  • NVL의 대체값은 원래 컬럼과 같은 데이터 타입이어야 한다.

'DBMS > 개념' 카테고리의 다른 글

16_ 트랜잭션 (Transaction)  (0) 2025.10.09
15_ 인덱스(Index)  (0) 2025.10.07
13_ 시퀀스  (0) 2025.10.03
12_ ALTER문  (0) 2025.10.01
11_ 제약 조건  (0) 2025.09.29