TECH/sql

[SQL] NULL 처리 완벽 가이드: NVL, IFNULL, COALESCE 차이점과 실무 활용법

런코리치 2026. 2. 24. 12:00

데이터베이스를 다루다 보면 피할 수 없는 존재가 있습니다. 바로 '값이 없음'을 의미하는 NULL입니다. NULL은 0도 아니고 공백("")도 아닌 특수한 상태이기 때문에, 이를 제대로 처리하지 않으면 덧셈 결과가 갑자기 사라지거나 논리 오류가 발생하여 서비스 장애로 이어지기도 합니다.

오늘은 각 DBMS(Oracle, MySQL, PostgreSQL)별 NULL 처리 함수와 실무에서 바로 써먹는 최적의 활용 전략을 정리해 보겠습니다.


1. 왜 NULL 처리가 중요한가?

SQL에서 NULL은 '알 수 없는 값(Unknown)'으로 취급됩니다. 따라서 다음과 같은 특성을 가집니다.

  • 산술 연산의 전염: 100 + NULL의 결과는 100이 아니라 NULL입니다.
  • 비교 연산의 실패: WHERE column = NULL은 작동하지 않습니다. 반드시 IS NULL을 사용해야 합니다.
  • 집계 함수의 제외: AVG나 SUM 계산 시 NULL인 행은 계산 대상에서 빠집니다.

이러한 특성 때문에 사용자에게 데이터를 보여줄 때는 반드시 적절한 기본값(0, 'N/A', '이름 없음' 등)으로 치환해 주는 과정이 필요합니다.


2. DBMS별 대표 NULL 처리 함수

사용하는 데이터베이스 엔진에 따라 함수명이 다릅니다. 각 함수의 특징을 살펴보겠습니다.

① Oracle: NVL과 NVL2

오라클에서 가장 전통적으로 쓰이는 함수입니다.

  • NVL(컬럼, 기본값): 컬럼이 NULL이면 기본값을 반환합니다.
  • NVL2(컬럼, NULL이 아닐 때 값, NULL일 때 값): NULL 유무에 따라 다른 값을 리턴할 때 유용합니다.
SQL
-- 예시: 보너스가 없으면 0으로 표시
SELECT name, NVL(bonus, 0) FROM employees;

-- 예시: 전화번호가 있으면 'Y', 없으면 'N'
SELECT name, NVL2(phone, 'Y', 'N') FROM users;

② MySQL: IFNULL과 ISNULL

MySQL 유저들이 가장 많이 사용하는 방식입니다.

  • IFNULL(컬럼, 기본값): 오라클의 NVL과 동일합니다.
  • COALESCE: MySQL에서도 표준으로 지원하며 권장되는 방식입니다.

③ SQL 표준: COALESCE (강력 추천)

Oracle, MySQL, PostgreSQL, SQL Server 모두에서 작동하는 표준 함수입니다.

  • 특징: 인자를 여러 개 전달할 수 있으며, NULL이 아닌 첫 번째 값을 반환합니다.
SQL
-- 예시: 집 전화번호가 없으면 핸드폰 번호, 그것도 없으면 '비상연락망 없음' 출력
SELECT name, COALESCE(home_phone, mobile_phone, 'N/A') FROM contacts;

3. 실무 예시로 배우는 NULL 처리 전략

💡 시나리오 1: 미입력 데이터 기본값 처리

회원 가입 시 '닉네임'을 입력하지 않은 사용자에게 "익명"이라는 이름을 부여해야 합니다.

SQL
SELECT 
    user_id, 
    COALESCE(nickname, '익명') AS display_name 
FROM users;

💡 시나리오 2: 통계 쿼리에서 0 처리

매출이 발생하지 않은 날은 결과가 나오지 않거나 NULL로 나옵니다. 이때 0원이라고 명시해야 합니다.

SQL
SELECT 
    sale_date, 
    NVL(SUM(price), 0) AS daily_revenue 
FROM sales 
GROUP BY sale_date;

💡 시나리오 3: NULL과 연산할 때의 주의사항

할인 금액이 NULL인 경우, 전체 결제 금액을 계산할 때 주의해야 합니다.

SQL
-- 나쁜 예 (할인액이 NULL이면 결제액 전체가 NULL이 됨)
SELECT price - discount_amount FROM orders;

-- 좋은 예 (할인액이 NULL이면 0으로 치환 후 연산)
SELECT price - COALESCE(discount_amount, 0) FROM orders;

4. 성능(Performance)과 NULL

NULL 처리 함수를 WHERE 절에 남발하면 인덱스를 타지 못해 조회 성능이 급격히 떨어질 수 있습니다.

  • 나쁜 예: WHERE NVL(status, 'A') = 'A' (인덱스 사용 불가)
  • 좋은 예: WHERE status = 'A' OR status IS NULL (인덱스 활용 가능)

데이터 양이 많다면 함수를 씌우기보다 원본 컬럼의 상태 그대로 비교하는 것이 튜닝의 기본입니다.


🏁 마무리하며: "어떤 함수를 써야 할까?"

  1. 호환성이 중요하다면? -> COALESCE를 사용하세요. 가장 표준적이고 강력합니다.
  2. Oracle 단일 환경이라면? -> 익숙한 NVL이 가독성 면에서 좋을 수 있습니다.
  3. 복잡한 분기가 필요하다면? -> CASE WHEN 문을 활용해 가독성과 성능을 동시에 잡으세요.

NULL 처리는 단순해 보이지만, 데이터의 무결성과 서비스의 신뢰도를 결정짓는 중요한 작업입니다. 이번 가이드가 여러분의 쿼리를 더 견고하게 만드는 데 도움이 되었기를 바랍니다.