SQL을 배우면서 처음 맞닥뜨리는 혼란 중 하나는 바로 NULL 값의 개념입니다. 숫자도 아니고, 빈 문자열도 아닌 이 애매한 존재는 자칫 잘못 이해하면 잘못된 데이터 처리나 예상치 못한 버그로 이어질 수 있습니다. 이번 글에서는 SQL에서 NULL이 무엇을 의미하는지, 그리고 실무에서 어떻게 다뤄야 하는지를 예시와 함께 차근차근 설명해보겠습니다.
NULL이란 무엇인가?
SQL에서 NULL은 "값이 없음" 또는 "알 수 없음"을 의미합니다. 숫자 0도 아니고, 빈 문자열도 아니며, 단순히 값이 존재하지 않는다는 의미입니다.
❌ 혼동하기 쉬운 것들
표현 의미
0 | 숫자 0, 존재하는 값 |
'' | 빈 문자열, 존재하는 값 |
NULL | 값 자체가 존재하지 않음 |
SELECT * FROM employees
WHERE phone_number = NULL; -- ❌ 작동하지 않음!
위 쿼리는 작동하지 않습니다. 이유는 NULL은 비교 연산자(=, <> 등)로 비교할 수 없기 때문입니다.
NULL을 다룰 때 사용하는 키워드
IS NULL / IS NOT NULL
NULL과 비교할 때는 반드시 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
-- 전화번호가 없는 직원 조회
SELECT * FROM employees
WHERE phone_number IS NULL;
-- 이메일이 있는 직원 조회
SELECT * FROM employees
WHERE email IS NOT NULL;
COALESCE() – NULL을 다른 값으로 대체
COALESCE()는 인자로 받은 값 중에서 NULL이 아닌 첫 번째 값을 반환합니다. 매우 자주 사용되는 함수입니다.
SELECT name, COALESCE(phone_number, '미등록') AS contact
FROM employees;
이 쿼리는 phone_number가 NULL일 경우 '미등록'이라는 문자열을 대신 보여줍니다.
💡 COALESCE()는 여러 값을 받을 수도 있고, IFNULL() (MySQL 전용)과 비슷한 역할을 합니다.
NULLIF() – 두 값이 같으면 NULL 반환
NULLIF(a, b)는 두 값이 같으면 NULL을 반환하고, 다르면 a를 반환합니다.
SELECT NULLIF(100, 100); -- 결과: NULL
SELECT NULLIF(100, 90); -- 결과: 100
주로 0으로 나누는 오류를 피할 때 사용됩니다.
-- 0으로 나누는 경우를 피하기 위한 예시
SELECT value / NULLIF(divisor, 0)
FROM table_name;
ISNULL() / IFNULL() – DBMS에 따라 다름
ISNULL(expr) → SQL Server
IFNULL(expr1, expr2) → MySQL
NVL(expr1, expr2) → Oracle
모두 expr1이 NULL일 경우 expr2를 반환하는 함수입니다.
-- MySQL에서 사용 예
SELECT name, IFNULL(department, '미지정') FROM employees;
❗ NULL이 문제를 일으키는 예시
집계 함수에서 NULL 무시
SQL의 집계 함수(SUM, AVG, COUNT, 등)는 기본적으로 NULL 값을 무시합니다.
-- salaries 테이블의 평균 급여 계산
SELECT AVG(salary) FROM salaries;
NULL 급여는 계산에서 제외되기 때문에, 데이터가 일부 누락된 상태일 수 있습니다.
NULL 때문에 조건문이 다르게 동작하는 경우
-- 조건문 예시
SELECT * FROM products
WHERE price > 100 OR price IS NULL;
이 쿼리는 price가 100보다 크거나 아예 값이 없는(NULL) 제품을 함께 조회합니다.
반면 다음 쿼리는 NULL 값을 무시합니다:
SELECT * FROM products
WHERE price > 100;
💡 NULL은 불확정(UNKNOWN) 이기 때문에 어떤 조건식에서도 참(TRUE) 이나 거짓(FALSE) 으로 판단되지 않으며, 조건에서 제외됩니다.
🧠 요약: NULL 다루기 핵심 정리
기능/문법 설명
IS NULL | 값이 NULL인지 확인 |
IS NOT NULL | 값이 NULL이 아닌지 확인 |
COALESCE(a, b) | a가 NULL이면 b 반환 |
NULLIF(a, b) | a와 b가 같으면 NULL 반환, 아니면 a |
IFNULL(a, b) | a가 NULL이면 b 반환 (MySQL) |
NVL(a, b) | a가 NULL이면 b 반환 (Oracle) |
집계 함수 | SUM, AVG 등은 NULL 값을 자동으로 무시 |