반응형

SQL NULL 관련 함수 완벽 정리 🌟

오늘은 SQL에서 자주 사용되면서도 초보자들이 헷갈려 하는 NULL 처리 함수들에 대해 알아보겠습니다.

SQL에서 NULL이란 ‘값이 없다’ 또는 ‘알 수 없는 값’을 의미합니다. 따라서 일반적인 값과는 다르게 처리해야 하는데요, 이때 유용하게 사용할 수 있는 함수들이 있습니다. 대표적인 NULL 처리 함수들을 하나씩 살펴볼까요?


🔍 1. NVL(컬럼명, 대체값)

NVL 함수는 Oracle에서 제공하는 함수로, 특정 컬럼이 NULL일 경우 지정한 다른 값으로 대체해줍니다.

사용법

SELECT NVL(COMM, 0)
FROM EMP;

의미: EMP 테이블의 COMM 컬럼 값이 NULL이라면 0으로 출력합니다.


🔍 2. IFNULL(컬럼명, 대체값)

MySQL/MariaDB에서 NVL 함수와 유사한 역할을 합니다.

사용법

SELECT IFNULL(COMM, 0)
FROM EMP;

의미: COMM 컬럼 값이 NULL이라면 0으로 표시합니다.


🔍 3. ISNULL(컬럼명, 대체값)

SQL Server에서 사용하는 NULL 대체 함수입니다.

사용법

SELECT ISNULL(COMM, 0)
FROM EMP;

의미: COMM 컬럼 값이 NULL일 때 0으로 변경하여 출력합니다.


🔍 4. COALESCE(컬럼1, 컬럼2, …, 컬럼n)

COALESCE 함수는 표준 SQL 함수로 여러 개의 컬럼 또는 표현식을 입력받아, NULL이 아닌 첫 번째 값을 반환합니다.

사용법

SELECT COALESCE(COMM, BONUS, 0)
FROM EMP;

의미: COMM 값이 NULL이라면 BONUS를 확인하고, BONUS도 NULL이라면 마지막 값 0을 출력합니다.

  • COALESCE는 여러 개의 컬럼을 사용할 수 있어 NVL이나 IFNULL보다 확장성이 높습니다.

🔍 5. NULLIF(표현식1, 표현식2)

두 표현식을 비교하여 값이 같다면 NULL을 반환하고, 다르면 표현식1의 값을 반환합니다.

사용법

SELECT NULLIF(SAL, 0)
FROM EMP;

의미: SAL이 0일 경우 NULL로 처리하여 출력하고, 0이 아니면 SAL의 원래 값을 출력합니다.


🌟 각 함수별 DB 지원 정리

함수명 Oracle MySQL/MariaDB SQL Server 표준 SQL
NVL ✔️
IFNULL ✔️
ISNULL ✔️
COALESCE ✔️ ✔️ ✔️ ✔️
NULLIF ✔️ ✔️ ✔️ ✔️

🎯 언제, 무엇을 쓰면 좋을까?

  • Oracle 환경이라면 NVL을, MySQL이라면 IFNULL을 선택하세요.
  • SQL Server에서는 ISNULL이 최적입니다.
  • 여러 컬럼 중 첫 번째로 나타나는 NULL이 아닌 값을 원할 땐 COALESCE를 쓰세요!
  • 특정 값이 나오면 강제로 NULL로 변환하고 싶다면 NULLIF가 딱입니다.

 

반응형
반응형

문제 설명

다음 SQL의 결과는 무엇일까요?

SELECT COUNT(*)
FROM T1
WHERE NOT EXISTS (
  SELECT 'X'
  FROM T2
  WHERE T1.COL1 = T2.COL1
);

T1 테이블

COL1

10
20

T2 테이블

COL1

10
NULL

① 2  ② 0  ③ 1  ④ 오류 발생


쿼리 분석 및 핵심 포인트

이 문제는 단순한 NOT EXISTS 서브쿼리 문제가 아니에요. NULL과의 비교 연산이 핵심 포인트입니다.

1.  NOT EXISTS란?

  • NOT EXISTS (SELECT ... FROM T2 WHERE 조건)은 T2의 조건절을 만족하는 값이 존재하지 않을 때 참이 됩니다.
  • 즉, T2에서 T1.COL1 = T2.COL1절대 참이 되지 않는 경우에만 해당 T1 행이 결과에 포함돼요.

 

2.  비교 연산자 =  NULL

여기서 주의할 점! SQL에서 NULL = 어떤 값은 무조건 UNKNOWN이 되고, 이는 WHERE 절에서 거짓(FALSE)으로 처리돼요.

예시:

  • 10 = 10 → TRUE
  • 10 = NULL → UNKNOWN → WHERE에서 걸러짐
  • NULL = NULL → UNKNOWN

실제 동작 흐름 분석

T1의 각 행에 대해 서브쿼리를 돌려보자!

T1의 첫 번째 행: COL1 = 10

서브쿼리:

SELECT 'X' FROM T2 WHERE T1.COL1 = T2.COL1;
-- 즉, WHERE 10 = T2.COL1;
  • T2에 10이 있음 → 조건 만족하는 행 있음 → EXISTS는 TRUE → NOT EXISTS는 FALSE
  • → T1의 이 행은 제외됨

 

T1의 두 번째 행: COL1 = 20

서브쿼리:

SELECT 'X' FROM T2 WHERE 20 = T2.COL1;
  • T2에는 20이 없음
  • 20 = NULL → 비교 불가(UNKNOWN)→ 이 행은 결과에 포함됨
  • → 조건을 만족하는 행이 하나도 없음EXISTS는 FALSE → NOT EXISTS는 TRUE

 

정답

→ 조건을 만족하는 행은 딱 T1의 두 번째 행 1개

③ 1


마무리 요약 정리

포인트 설명
NOT EXISTS 조건을 만족하는 값이 없을 때 참
NULL = 값 항상 UNKNOWN으로 평가됨
조건절 내 NULL 처리 조심해야 하며, 존재 유무 판단 시 혼란을 유발함
NULL이 있는 컬럼과 비교하는 서브쿼리에서는, 절대 = 조건이 항상 원하는 결과를 주지 않음! EXISTS/NOT EXISTS에서 더더욱 주의!
반응형

+ Recent posts