일치하는 값이 없는 행 찾기(안티 조인)
고아 레코드와 누락된 데이터를 찾는 LEFT JOIN 및 IS NULL 패턴을 알아봅니다.
일치하는 값이 없는 행 찾기(안티 조인)은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
안티 조인 질문
가장 자주 나오는 외부 조인 질문 중 하나는 “한 번도 주문하지 않은 고객을 찾으십시오.”입니다. 또는 “한 번도 판매되지 않은 상품을 나열하십시오.”, “일치하는 고객이 없는 주문을 찾으십시오.”와 같은 질문도 있습니다.
이 질문들은 모두 한 테이블에는 있지만 다른 테이블에는 일치하는 행이 없는 행이라는 동일한 형태를 가집니다. 깔끔한 관용 패턴은 LEFT JOIN과 IS NULL 조건으로 만드는 안티 조인입니다.
핵심 아이디어
LEFT JOIN에서 시작하십시오. LEFT JOIN은 모든 왼쪽 행을 유지하고, 일치하지 않는 왼쪽 행의 오른쪽 테이블 열에는 NULL이 들어갑니다.
따라서 일치하지 않는 행은 오른쪽 테이블의 열이 NULL인 경우와 정확히 같습니다. 이를 조건으로 걸러내면 일치하는 행이 없는 행만 추려낼 수 있습니다. 이것이 전체 요령입니다.
패턴 만들기
주문이 없는 고객을 찾는 표준 안티 조인입니다. 두 단계로 읽으십시오. LEFT JOIN이 모든 고객을 유지한 다음, WHERE o.customer_id IS NULL이 일치하지 않는 고객만 남깁니다.
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
WHERE o.customer_id IS NULL;
-- only customers with zero orders단계별 작동 원리
캐럴에게 주문이 없는 데이터로 과정을 따라가 보십시오.
- LEFT JOIN은 앨리스(2개), 밥(1개), 그리고 오른쪽 열이 NULL인 캐럴을 생성합니다.
WHERE o.customer_id IS NULL은 오른쪽 열에 실제 값이 있는 앨리스와 밥을 제거합니다.- NULL이 만들어진 행인 캐럴의 행만 남습니다.
조건은 조인 후에 실행되므로 이 NULL을 확인하고 고아 행만 정확히 선택합니다.
확인할 올바른 열 선택
실제로 일치하는 행에서는 정상적으로 NULL이 될 수 없는 오른쪽 테이블 열을 확인하십시오. 이상적으로는 조인 키나 기본 키를 사용합니다.
o.shipped_at처럼 NULL을 허용하는 오른쪽 열을 확인하면, 실제로 존재하지만 아직 배송되지 않은 주문까지 찾아내므로 잘못된 결과가 됩니다. o.customer_id(조인 키)나 o.id(기본 키)를 확인하면 NULL이 “일치하는 행이 없음”을 의미한다는 것을 보장할 수 있습니다.
-- SAFE: join key / primary key
WHERE o.id IS NULL
-- RISKY: a nullable data column
WHERE o.shipped_at IS NULL -- catches unshipped too!안티 조인과 NOT IN 비교
면접관은 안티 조인을 NOT IN과 비교합니다. 겉보기에는 같지만 NULL을 처리하는 방식이 다릅니다.
하위 쿼리가 NULL을 하나라도 반환하면 NOT IN은 행을 전혀 반환하지 않습니다. 이는 악명 높은 조용한 버그입니다. LEFT JOIN / IS NULL 안티 조인은 이 문제의 영향을 받지 않습니다.
-- DANGEROUS if any customer_id is NULL
SELECT id, name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- SAFE anti-join, same intent
SELECT c.id, c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;안티 조인과 NOT EXISTS 비교
또 다른 동등한 방법은 상관 하위 쿼리와 함께 NOT EXISTS를 사용하는 것입니다. 이 방법도 NULL을 올바르게 처리하며, 성능도 대체로 비슷합니다.
세 가지 방법(LEFT JOIN/IS NULL, NOT EXISTS, NOT IN) 모두 안티 조인을 표현할 수 있지만, NULL 안전성 때문에 면접에서는 LEFT JOIN/IS NULL 또는 NOT EXISTS를 선호하십시오. NOT IN의 함정을 언급하면 좋은 평가를 받을 수 있습니다.
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);흔한 실수
자주 발생하는 오류는 일치하는 행이 없는 조건을 WHERE가 아니라 ON 절에 넣는 것입니다.
... ON o.customer_id = c.id AND o.id IS NULL이라고 작성해도 결과를 걸러내지 않습니다. 단지 무엇을 일치하는 것으로 볼지만 바꾸므로 모든 고객이 여전히 LEFT JOIN 결과에 남습니다. IS NULL 조건은 조인 후에 적용되도록 WHERE에 있어야 합니다. 이 함정은 다음 수업에서 자세히 다룹니다.
고아 자식 행 찾기
이 패턴은 반대 방향에도 적용됩니다. 존재하지 않는 고객을 참조하는 주문(고아 행이며 데이터 무결성 확인에 해당)을 찾으려면 orders를 보존하고 고객 쪽이 NULL인지 확인하십시오.
SELECT o.id AS order_id, o.customer_id
FROM orders o
LEFT JOIN customers c
ON c.id = o.customer_id
WHERE c.id IS NULL;
-- orders pointing to a non-existent customer고아 행 개수 세기
질문이 단순히 개수를 묻는 경우도 많습니다. “한 번도 주문하지 않은 고객이 몇 명입니까?”와 같은 질문입니다. 안티 조인을 감싸거나 직접 개수를 세면 됩니다.
안티 조인은 이미 고아 행마다 하나의 행을 반환하므로, 여기서는 일반적인 COUNT(*)로 올바른 결과를 얻습니다. 일치하지 않는 고객마다 정확히 한 행이 있기 때문입니다.
SELECT COUNT(*) AS never_ordered
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;재사용 가능한 템플릿
이 세 줄짜리 뼈대를 외워 두십시오. 매우 많은 면접 질문을 해결할 수 있습니다.
FROM keep_table kLEFT JOIN other o ON o.fk = k.idWHERE o.id IS NULL
테이블과 키를 바꾸면 판매되지 않은 상품, 할당되지 않은 티켓, 로그인 기록이 없는 사용자 등 “일치하는 Y가 없는 X”라는 형태의 모든 문제를 해결할 수 있습니다.
빠른 확인
주문 항목 테이블에 한 번도 나타나지 않은 상품이 필요합니다.
요약
안티 조인은 일치하는 행이 없는 행을 찾습니다. 즉, LEFT JOIN을 사용한 다음 WHERE right_key IS NULL을 적용합니다.
- 조인 키나 기본 키를 확인하고, NULL을 허용하는 데이터 열은 절대 확인하지 마십시오.
IS NULL조건은ON이 아니라WHERE에 있어야 합니다.NOT EXISTS와 동등합니다. NULL에서 문제가 발생하는NOT IN보다 이를 선호하십시오.- 테이블 순서를 뒤집으면 고아 자식 행을 찾을 수 있습니다.
하나의 템플릿으로 “일치하는 Y가 없는 X”라는 많은 질문을 해결할 수 있습니다.
자주 묻는 질문
“일치하는 값이 없는 행 찾기(안티 조인)” 강의는 무료인가요?
네 — “일치하는 값이 없는 행 찾기(안티 조인)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“일치하는 값이 없는 행 찾기(안티 조인)”에서 뭘 배우나요?
고아 레코드와 누락된 데이터를 찾는 LEFT JOIN 및 IS NULL 패턴을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“일치하는 값이 없는 행 찾기(안티 조인)” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- LEFT JOIN과 일치하지 않는 행 보존하기
- RIGHT 및 FULL OUTER JOIN의 의미
- 일치하는 값이 없는 행 찾기(안티 조인)
- 외부 JOIN에서 WHERE를 사용하는 함정