IS NULL과 IS NOT NULL
누락된 값을 올바르게 테스트합니다.
IS NULL과 IS NOT NULL은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
누락된 값 검사
NULL과의 비교는 항상 알 수 없음을 반환하므로, SQL은 누락된 값을 검사하기 위한 두 가지 전용 연산자인 IS NULL과 IS NOT NULL을 제공합니다.
NULL을 찾거나 제외하는 신뢰할 수 있는 방법은 이것뿐입니다. 이 레슨에서는 이를 올바르게 사용하는 방법을 배웁니다.
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;= NULL이 작동하지 않는 이유
WHERE phone = NULL이라고 쓰고 싶겠지만, 이는 어떤 행과도 일치하지 않습니다. 모든 행에서 조건의 결과가 unknown이 되고, WHERE는 참인 행만 유지하기 때문입니다.
그 결과는 빈 집합이 됩니다 — 오류가 발생하지 않으므로 알아채기 어려운 버그입니다.
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;IS NULL 사용 예
IS NULL은 값이 누락된 경우에 정확히 true를 반환하고, 그 외에는 false를 반환합니다. unknown을 반환하는 경우는 없습니다.
따라서 참 또는 거짓의 명확한 결과가 필요한 곳 어디에서나 안전하게 사용할 수 있습니다.
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tIS NOT NULL 사용 예
IS NOT NULL은 정반대입니다. 값이 있으면 true, 누락되었으면 false를 반환합니다.
실제로 데이터가 있는 행만 필터링할 때 사용하십시오. 예를 들어 전화를 걸 수 있는 고객을 찾을 때 유용합니다.
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101AND / OR와 결합
AND와 OR를 사용하면 NULL 검사와 다른 조건을 결합할 수 있습니다.
예를 들어 아직 전화번호가 등록되지 않은 활성 고객을 찾을 수 있습니다 — 데이터 품질을 점검할 때 흔히 사용하는 질의입니다.
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNOT IN의 NULL: 함정
목록에 NULL이 포함되면 NOT IN은 예상과 다르게 동작할 수 있습니다. 집합의 값 중 하나라도 NULL이면 NOT IN이 모든 행에 대해 unknown을 반환할 수 있어, 예상한 결과가 제거됩니다.
NOT EXISTS를 사용하거나 하위 질의에서 먼저 NULL을 제외하십시오.
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
PostgreSQL은 NULL을 안전하게 비교하는 연산자인 IS DISTINCT FROM과 IS NOT DISTINCT FROM을 제공합니다.
=와 달리 이 연산자들은 두 NULL을 같은 것으로, NULL과 값을 서로 다른 것으로 취급하며 항상 true 또는 false를 반환하고 unknown은 반환하지 않습니다.
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueNULL을 허용하는 두 열 비교
둘 다 NULL일 수 있는 두 열을 비교할 때 일반적인 =는 두 값이 모두 NULL인 경우를 놓칩니다. IS NOT DISTINCT FROM을 사용하면 이 경우도 올바르게 처리할 수 있습니다.
값을 알 수 없는 경우에도 변경되지 않은 행을 찾을 때 특히 유용합니다.
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;NULL 개수 세기
IS NULL은 데이터 품질을 점검할 때 실용적으로 사용할 수 있습니다 — 값이 누락된 행이 몇 개인지 세는 것입니다.
FILTER(PostgreSQL) 또는 COUNT 안의 CASE와 함께 사용하면 NULL과 NULL이 아닌 값의 개수를 나란히 셀 수 있습니다.
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;CHECK 제약 조건에서 NULL 검사
CHECK 제약 조건 안에서 NULL 검사를 사용해 "행이 배송된 상태라면 배송 날짜가 있어야 한다"와 같은 규칙을 적용할 수 있습니다.
참고: CHECK 제약 조건은 조건이 true 또는 unknown이면 통과하므로 NULL인 경우를 신중하게 고려해야 합니다.
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);모범 사례
NULL을 안전하게 다루려면 다음 습관을 지키십시오:
- 항상
IS NULL/IS NOT NULL로 검사하고,= NULL은 절대 사용하지 마십시오. - NULL을 허용하는 하위 질의와 함께 사용하는
NOT IN을 주의하십시오. - NULL을 안전하게 비교하려면
IS DISTINCT FROM을 사용하십시오. count(*) FILTER (...)로 누락된 데이터를 점검하십시오.
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM b빠른 확인
phone 열에 값이 없는 모든 고객을 원합니다. 어떤 WHERE 절이 올바릅니까?
복습
IS NULL 및 IS NOT NULL을 사용하여 누락된 값을 확인하는 올바른 방법과 = NULL이 절대 작동하지 않는 이유를 배웠습니다.
NOT IN 함정, NULL에 안전한 IS DISTINCT FROM 연산자, FILTER를 사용해 NULL을 점검하는 방법도 살펴보았습니다. 다음으로 COALESCE 및 NULLIF를 사용하여 NULL을 합리적인 기본값으로 대체하는 방법을 배웁니다.
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;자주 묻는 질문
“IS NULL과 IS NOT NULL” 강의는 무료인가요?
네 — “IS NULL과 IS NOT NULL” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“IS NULL과 IS NOT NULL”에서 뭘 배우나요?
누락된 값을 올바르게 테스트합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“IS NULL과 IS NOT NULL” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- NULL의 진정한 의미
- IS NULL과 IS NOT NULL
- COALESCE와 NULLIF
- 집계와 JOIN에서의 NULL