3값 논리와 UNKNOWN
NULL = NULL이 TRUE가 아닌 이유와 UNKNOWN이 조건 전체에 전파되는 방식을 알아봅니다.
3값 논리와 UNKNOWN은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
NULL이 지원자를 혼란스럽게 하는 이유
NULL은 SQL 면접에서 오답이 나오는 가장 큰 원인입니다. 함정은 NULL을 일반적인 값처럼 다루는 데 있습니다. 실제로 NULL은 '알 수 없음' 또는 '누락됨'을 의미하며, 0도 아니고 빈 문자열도 아닙니다.
면접관이 이 주제를 좋아하는 이유는 구문은 올바르게 보이지만 결과가 아무런 표시 없이 잘못되기 때문입니다. '당연히' 한 행을 반환해야 할 것 같은 필터를 보여 주고 왜 아무것도 반환하지 않는지 물어볼 수도 있습니다.
이 수업에서는 모든 NULL 문제를 해결하는 사고방식인 3값 논리를 익히게 됩니다. 비교 결과가 TRUE, FALSE 또는 UNKNOWN일 수 있다는 점을 이해하면 나머지는 자연스럽게 따라옵니다.
NULL은 값이 아닙니다
면접에서 말해야 할 가장 중요한 한 문장은 다음과 같습니다: NULL은 값 자체가 아니라 값의 부재입니다.
따라서 숫자를 비교할 때처럼 =로 NULL을 비교할 수 없습니다. 데이터베이스는 두 개의 알 수 없는 값이 같은지 알 수 없으므로 TRUE인지 FALSE인지 확정하지 않습니다.
NULL = 5는 FALSE가 아니라 UNKNOWN입니다NULL = NULL은 TRUE가 아니라 UNKNOWN입니다NULL <> NULL도 UNKNOWN입니다
이 때문에 NULL을 허용하는 열에 단순한 동등성 필터를 적용하면 행이 조용히 제외됩니다.
2값 논리와 3값 논리
대부분의 프로그래밍 언어는 2값 논리를 사용하므로 식은 TRUE이거나 FALSE입니다. SQL에서는 비교에 NULL이 포함될 때 세 번째 결과인 UNKNOWN을 추가합니다.
따라서 SQL의 모든 술어는 TRUE, FALSE, UNKNOWN 중 하나로 평가될 수 있습니다. WHERE 절은 술어가 정확히 TRUE인 경우에만 행을 유지합니다. UNKNOWN은 필터링할 때 FALSE처럼 동작하지만, 논리적으로 같은 것은 아닙니다.
면접관은 이 차이를 알고 있는지 확인합니다. UNKNOWN은 FALSE와 달리 NOT 아래에서 다르게 동작하기 때문입니다.
행을 조용히 제외하는 필터
다음은 전형적인 예제입니다. bonus가 때때로 NULL이라고 가정해 보겠습니다. 채용 담당자가 이렇게 묻습니다: '이 쿼리는 보너스가 1000이 아닌 모든 사람을 반환해야 합니다. 그런데 왜 보너스가 없는 직원은 제외되나요?'
bonus가 NULL인 행에서는 bonus <> 1000이 TRUE가 아니라 UNKNOWN으로 평가됩니다. WHERE는 TRUE인 행만 유지하므로 해당 직원들이 결과에서 사라집니다.
해결 방법은 NULL을 명시적으로 처리하는 것이며, 이는 다음 수업에서 다룹니다. 지금은 누락된 행이 버그가 아니라 논리의 결과라는 점을 기억하세요.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUEAND 식에서의 NULL
3값 논리는 AND의 작동 방식도 바꿉니다. 이 규칙을 외워 두면 어떤 진리표 문제든 즉시 답할 수 있습니다.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
직관적으로는 다음과 같습니다. AND는 하나의 FALSE만 있어도 결과를 확실히 FALSE로 만들 수 있습니다. 따라서 FALSE AND 어떤 값이든 결과는 FALSE입니다. 하지만 TRUE AND 알 수 없는 값은 여전히 알 수 없습니다. 알 수 없는 쪽의 결과가 어느 쪽으로든 바뀔 수 있기 때문입니다.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedOR 식에서의 NULL
OR는 AND와 반대 방식으로 동작합니다. 하나의 TRUE만 있어도 결과를 확실히 TRUE로 만들 수 있으므로 TRUE가 UNKNOWN의 영향을 없앱니다.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
따라서 한 분기의 결과를 알 수 없더라도 다른 분기가 확실히 TRUE라면 행은 OR 조건을 충족할 수 있습니다. 이는 AND 문제 다음에 자주 나오는 추가 질문입니다.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT은 TRUE와 FALSE를 뒤집지만 UNKNOWN은 뒤집지 않습니다
면접관이 마지막에 내는 미묘한 문제는 다음과 같습니다. NOT은 TRUE를 FALSE로, FALSE를 TRUE로 바꾸지만 NOT UNKNOWN은 여전히 UNKNOWN입니다.
따라서 실패하는 조건을 NOT으로 감싸 결과를 뒤집을 수는 없습니다. NULL인 행에서 bonus = 1000이 UNKNOWN이라면 NOT (bonus = 1000)도 UNKNOWN이므로 해당 행은 여전히 제외됩니다.
부정만으로는 NULL 행을 복원할 수 없습니다. 명시적인 IS NULL 검사만이 이를 해결합니다.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);예제로 살펴보기: NOT IN의 함정
가장 자주 나오는 NULL 문제 중 하나입니다. NULL을 포함하는 목록과 함께 NOT IN을 사용하면 행을 하나도 반환하지 않습니다. NULL을 그냥 건너뛸 것이라고 예상하는 지원자에게는 놀라운 결과입니다.
내부적으로 x NOT IN (1, 2, NULL)은 x <> 1 AND x <> 2 AND x <> NULL로 확장됩니다. 마지막 비교 결과가 UNKNOWN이고 TRUE AND TRUE AND UNKNOWN은 UNKNOWN이 되므로 조건을 충족하는 항목이 없습니다.
안전한 대안은 이러한 문제에 취약하지 않은 NOT EXISTS입니다.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.WHERE에서 UNKNOWN이 FALSE처럼 동작하는 이유
자주 나오는 추가 질문은 다음과 같습니다: 'UNKNOWN이 FALSE가 아니라면 왜 행이 FALSE인 행과 똑같이 제외되나요?'
정확한 답은 다음과 같습니다. WHERE, ON, HAVING은 모두 TRUE인 것만 유지하는 규칙을 사용합니다. FALSE와 UNKNOWN은 모두 이 검사를 통과하지 못하므로 필터링할 때는 동일하게 보입니다.
차이는 부정과 CHECK 제약 조건에서만 드러납니다. CHECK 제약 조건은 조건이 TRUE 또는 UNKNOWN일 때 행을 통과시키므로, 차단될 것이라고 생각한 CHECK를 NULL이 빠져나갈 수 있습니다.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowed더 깊이 살펴보기: COUNT와 진릿값의 간극
현실적인 면접 질문으로 지금까지의 내용을 연결해 보겠습니다. '직원이 100명 있습니다. SELECT COUNT(*) WHERE bonus = 100은 30을 반환하고 WHERE bonus <> 100은 50을 반환합니다. 나머지 20명은 어디에 있나요?'
나머지 20명은 보너스가 NULL입니다. 이들에게는 = 100도 <> 100도 TRUE가 아니며 둘 다 UNKNOWN이므로 두 필터를 모두 빠져나갑니다.
'NULL은 어느 술어도 만족하지 않기 때문에 각 범주의 합계가 전체와 일치하지 않습니다'라고 답하는 것이 면접관이 원하는 정확한 답입니다.
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;면접에서 짚어야 할 핵심 사항
NULL 논리가 나오면 다음 사항을 말해 숙련자다운 모습을 보여 주세요:
- NULL은 알 수 없음을 의미하며, NULL과 비교하면 UNKNOWN이 됩니다.
- SQL은 3값 논리를 사용합니다: TRUE, FALSE, UNKNOWN.
- WHERE, ON, HAVING은 TRUE인 행만 유지합니다.
NOT UNKNOWN도 여전히 UNKNOWN이므로 부정만으로는 NULL 행을 복원할 수 없습니다.- NULL이 하나라도 포함된
NOT IN은 행을 반환하지 않으므로NOT EXISTS를 우선 사용하세요.
먼저 모델을 설명한 다음 진리표를 따라가세요. 이 순서는 단순히 요령을 아는 것이 아니라 이유를 이해하고 있다는 신호가 됩니다.
빠른 확인
3값 논리에 대한 이해도를 확인해 보세요.
복습
이제 NULL에 대한 핵심 사고방식을 익혔습니다:
- NULL은 값이 아니라 알 수 없음이므로
=또는<>로 비교하지 마세요. - SQL은 3값을 사용합니다. 술어는 TRUE, FALSE 또는 UNKNOWN을 반환합니다.
- 필터링 절은 TRUE인 것만 유지하므로 UNKNOWN인 행은 FALSE인 행처럼 사라집니다.
NOT은 TRUE와 FALSE를 뒤집지만 UNKNOWN은 그대로 둡니다.NOT IN과 NULL을 함께 사용할 때 행이 0개가 되는 함정이 있으므로NOT EXISTS를 사용하세요.
다음으로는 IS NULL, IS NOT NULL 및 NULL 안전 동등성 연산자를 사용해 NULL을 올바르게 검사하는 방법을 알아봅니다.
자주 묻는 질문
“3값 논리와 UNKNOWN” 강의는 무료인가요?
네 — “3값 논리와 UNKNOWN” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“3값 논리와 UNKNOWN”에서 뭘 배우나요?
NULL = NULL이 TRUE가 아닌 이유와 UNKNOWN이 조건 전체에 전파되는 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“3값 논리와 UNKNOWN” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.