본문 바로가기
C.W.K.
Stream
Lesson 07 of 16 · published

질의 안의 NULL

~12 min · queries, null

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

참과 거짓 사이에 알 수 없음이 있어

NULL = NULL은 참이 아니고 WHERE x = NULL도 원하는 행을 찾지 못해. 값이 비었는지는 IS NULL로 검사해야 해. WHERE x <> 'something'은 NULL 행을 제외하므로 포함하려면 OR x IS NULL을 명시해.

NOT IN의 함정

하위 질의에 NULL이 하나라도 있으면 NOT IN (subquery) 전체가 알 수 없음이 될 수 있어. 존재 여부를 묻는 뜻이라면 NOT EXISTS가 더 안전해. NULL을 값으로 바꿔야 할 때는 COALESCE(a, b, c), 두 값이 같을 때 NULL로 만들려면 NULLIF(a, b)를 써.

NULL까지 포함한 동등성

IS DISTINCT FROMIS NOT DISTINCT FROM은 NULL을 보통 값처럼 비교해. 3값 논리를 피하고 싶은 자리에서 유용해. 0과 NULL을 섞지 말고, 값이 0인 경우와 값을 모르는 경우를 뜻부터 구분해.

Code

NULL이 만드는 예상 밖의 결과·sql
SELECT NULL = NULL;        -- NULL  (TRUE 아님)
SELECT NULL <> NULL;       -- NULL  (FALSE 아님)
SELECT 5 + NULL;           -- NULL
SELECT NULL OR TRUE;       -- TRUE  (NULL OR TRUE = TRUE)
SELECT NULL AND TRUE;      -- NULL
SELECT NULL = NULL IS TRUE;-- FALSE  (IS 가 3-값 로직 처리)
WHERE에서 NULL 처리·sql
-- 음의 케이스에서 NULL discount 포함
SELECT * FROM products
WHERE  discount <> 0.5 OR discount IS NULL;

-- 또는 IS DISTINCT FROM
SELECT * FROM products
WHERE  discount IS DISTINCT FROM 0.5;

-- display 에서 NULL fallback
SELECT name, COALESCE(phone, 'N/A') AS phone
FROM   contacts;

-- 0 으로 나누기 회피
SELECT revenue, expenses,
       revenue / NULLIF(expenses, 0) AS ratio
FROM   financials;

External links

Exercise

위의 NULL 함정 4가지를 각각 재현하는 작은 질의를 만들고 안전한 형태로 다시 써. 추가로 NOT INNOT EXISTS로 바꿨을 때 결과가 달라지는 사례를 만들어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.