0Pricing
SQL Interview Prep · 강의

IS NULL, IS NOT NULL과 NULL 안전 동등성

NULL을 올바르게 테스트하고 데이터베이스별 NULL 안전 연산자를 사용하는 방법을 알아봅니다.

IS NULL, IS NOT NULL과 NULL 안전 동등성은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

NULL을 올바르게 검사하기

이전 수업에서 =으로 NULL을 찾을 수 없다는 것을 확인했습니다. 그렇다면 NULL은 어떻게 검사해야 할까요? 전용 술어인 IS NULL과 IS NOT NULL을 사용하면 됩니다.

누락된 값을 확인하는 올바르고 이식 가능한 방법은 이것뿐이며, 면접관은 col = NULL을 볼 때마다 이를 오답으로 판단할 것입니다.

이 수업에서는 IS NULL, IS NOT NULL, IS DISTINCT FROM 계열과 데이터베이스별 NULL 안전 동등성 연산자를 다룹니다. 데이터베이스 간 차이를 알고 있다면 숙련자다운 강점이 됩니다.

IS NULL과 IS NOT NULL

IS NULL은 값이 NULL일 때 TRUE를 반환하고, 그 외에는 FALSE를 반환합니다. 중요한 점은 UNKNOWN을 절대 반환하지 않으므로 WHERE에서 직접 사용해도 안전하다는 것입니다.

IS NOT NULL은 정확히 그 반대입니다. 실제 값이면 TRUE를, NULL이면 FALSE를 반환합니다.

이 술어들은 NULL을 처리하는 핵심 도구입니다. 표준 SQL이며 MySQL, Postgres, SQL Server, Oracle, SQLite에서 동일하게 동작합니다.

-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;

-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;

col = NULL이 항상 잘못된 이유

면접에서 확실히 나오는 함정이 있습니다. 지원자가 누락된 보너스를 찾으려고 WHERE bonus = NULL을 작성하는 경우입니다. 이 쿼리는 행을 0개 반환합니다.

3값 논리를 기억하세요. bonus = NULL은 NULL인 행을 포함한 모든 행에서 UNKNOWN입니다. 알 수 없는 값과 같은 것은 없기 때문입니다. WHERE는 TRUE인 것만 유지하므로 일치하는 행이 없습니다.

일부 데이터베이스는 비표준 모드에서 = NULL을 조용히 IS NULL로 다시 작성하지만, 이에 의존해서는 안 됩니다. 항상 IS NULL을 명시적으로 작성하세요.

-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;

-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;

NULL과 NULL이 아닌 값 세기

분석가가 자주 하는 작업 중 하나는 데이터 품질 감사입니다. 열이 얼마나 완전한지 확인하는 작업입니다. 누락된 값을 보고하려면 IS NULL과 COUNT를 함께 사용하세요.

차이를 확인하세요. COUNT(*)은 모든 행을 세지만 COUNT(bonus)는 NULL이 아닌 보너스만 셉니다. 두 결과의 차이가 NULL의 개수이며, 이 내용은 집계 수업에서 다시 살펴봅니다.

SELECT
  COUNT(*)                                AS total_rows,
  COUNT(bonus)                            AS with_bonus,
  COUNT(*) - COUNT(bonus)                 AS missing_bonus,
  SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;

NULL 안전 동등성이 해결하는 문제

두 열을 비교할 때 '둘 다 NULL이면 일치'하는 것으로 처리하고 싶다고 가정해 보겠습니다. 일반적인 a = b는 실패합니다. 둘 다 NULL이면 결과가 UNKNOWN이 되므로 직관적으로는 '같은' 값인데도 해당 쌍이 제외됩니다.

이 문제는 변경 사항을 감지하려고 이전 행과 새 행을 비교할 때나 선택적 열을 기준으로 조인할 때 발생합니다. NULL과 NULL의 비교 결과가 TRUE이고 NULL과 값의 비교 결과가 FALSE인 비교가 필요합니다. 이것이 NULL 안전 동등성이 제공하는 기능입니다.

-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
--   NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note;  -- misses rows where both notes are NULL

IS DISTINCT FROM(표준 SQL)

ANSI 표준의 NULL 안전 비교 방식은 IS DISTINCT FROM과 그 반대인 IS NOT DISTINCT FROM입니다. Postgres, SQL Server(2022 이상) 및 다른 데이터베이스에서 지원됩니다.

  • a IS NOT DISTINCT FROM b는 'NULL = NULL도 같은 것으로 취급하는 같음'을 의미합니다.
  • a IS DISTINCT FROM b는 'NULL을 일반적인 값처럼 취급하는 다름'을 의미합니다.

이 연산자들은 항상 TRUE 또는 FALSE를 반환하고 UNKNOWN은 반환하지 않으므로 술어가 필요한 모든 곳에서 안전하게 사용할 수 있습니다.

-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;

-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;

MySQL의 <=> 연산자

MySQL에는 <=>로 표기하는 간결한 NULL 안전 동등성 연산자, 즉 우주선 연산자가 포함되어 있습니다.

a <=> b는 양쪽이 같거나 양쪽 모두 NULL일 때 1(TRUE)을 반환하고, 그 외에는 0(FALSE)을 반환합니다. 이는 MySQL에서 IS NOT DISTINCT FROM에 해당합니다.

면접관이 MySQL에서 NULL 안전 일치를 구체적으로 묻는다면 이것이 관용적인 답변입니다.

-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null,   -- 1
       (NULL <=> 5)    AS null_vs_val, -- 0
       (5 <=> 5)       AS val_eq;      -- 1

SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;

SQL 방언별 요약표

면접관은 이식성의 경계를 아는 지원자를 높이 평가합니다. 다음은 NULL 안전 동등 비교 대응표입니다:

  • ANSI / 포스트그레스 / SQL 서버 2022+: IS NOT DISTINCT FROM
  • MySQL / MariaDB: <=>
  • 에스큐라이트: IS와 IS NOT은 NULL 안전 동등 비교로 사용할 수 있습니다
  • 오라클: 기본 제공 연산자가 없으므로 DECODE(a, b, 1, 0) = 1 또는 COALESCE를 활용해 동일하게 구현합니다

사용 중인 엔진이 확실하지 않다면 다음에 나오는 이식 가능한 수동 형식을 사용하십시오.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

이식 가능한 수동 NULL 안전 일치

기본 제공 연산자를 사용할 수 없을 때는 기본 요소를 조합해 NULL 안전 동등 비교를 만들 수 있습니다. 이식 가능한 패턴은 일반 동등 비교와 두 값이 모두 NULL인 경우를 명시하는 절을 결합합니다.

이는 '두 값이 같거나, 둘 다 누락된 경우'라고 읽으면 됩니다. 모든 데이터베이스에서 작동하므로, 면접관이 SQL 방언을 명확히 지정하지 않았을 때 훌륭한 답변이 됩니다.

SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
   OR (o.note IS NULL AND n.note IS NULL);

-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')

심화 예제: NULL 안전 JOIN 키

현실적인 함정은 NULL을 허용하는 키로 조인하는 경우입니다. 양쪽의 region이 NULL일 수 있다면, 일반 동등 조인은 NULL = NULL이 UNKNOWN이므로 해당 행 쌍을 조용히 제외합니다.

비즈니스 규칙이 '지역이 없는 행도 다른 지역 없음 행과 일치해야 한다'라면 조인 조건을 NULL 안전하게 만들어야 합니다. 면접에서는 이 가정을 소리 내어 밝힌 다음, 엔진에 맞는 연산자를 선택하십시오.

-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
  ON a.region IS NOT DISTINCT FROM b.region;

-- MySQL equivalent: ON a.region <=> b.region

면접 핵심 포인트

NULL 검사 관련 질문에는 다음과 같이 명확하게 대응하십시오:

  • 항상 IS NULL / IS NOT NULL을 사용하고, = NULL은 절대 사용하지 마십시오.
  • 이러한 조건식은 TRUE 또는 FALSE만 반환하므로 WHERE에서 안전하게 사용할 수 있습니다.
  • 'NULL과 NULL이 같은지' 비교할 때는 IS NOT DISTINCT FROM(ANSI) 또는 <=>(MySQL)를 사용하십시오.
  • 어떤 SQL 방언을 대상으로 하는지 밝히고, 확실하지 않다면 이식 가능한 OR 절 대체 방법을 제시하십시오.

표준 연산자와 공급업체별 연산자를 모두 언급하면 심사자가 알아차리는 폭넓은 지식을 보여 줄 수 있습니다.

빠른 확인

올바른 NULL 안전 비교를 선택하십시오.

요약

이제 NULL을 올바르게 검사할 수 있습니다:

  • IS NULL / IS NOT NULL만이 올바르고 이식 가능한 NULL 검사이며, UNKNOWN을 반환하지 않습니다.
  • col = NULL은 항상 행을 하나도 반환하지 않습니다. 이는 면접에서 자주 나오는 함정입니다.
  • NULL 안전 동등 비교는 두 NULL을 같은 것으로 처리합니다: IS NOT DISTINCT FROM(ANSI/포스트그레스), <=>(MySQL), IS(에스큐라이트).
  • 연산자가 없을 때는 (a = b) OR (a IS NULL AND b IS NULL)을 사용하십시오.

다음: COALESCE, NULLIF 및 ISNULL 같은 공급업체별 함수를 사용해 NULL을 기본값으로 대체하는 방법입니다.

자주 묻는 질문

“IS NULL, IS NOT NULL과 NULL 안전 동등성” 강의는 무료인가요?

네 — “IS NULL, IS NOT NULL과 NULL 안전 동등성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“IS NULL, IS NOT NULL과 NULL 안전 동등성”에서 뭘 배우나요?

NULL을 올바르게 테스트하고 데이터베이스별 NULL 안전 연산자를 사용하는 방법을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“IS NULL, IS NOT NULL과 NULL 안전 동등성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 3값 논리와 UNKNOWN
  2. IS NULL, IS NOT NULL과 NULL 안전 동등성
  3. COALESCE, NULLIF와 ISNULL
  4. 집계, JOIN과 DISTINCT에서의 NULL
← SQL Interview Prep(으)로 돌아가기