
프로그래머스 SQL 쿼리 문제를 풀던 중 서브 쿼리의 결과를 가지고 있지 않은 경우, 출력해주기 위해서 NOT IN 구문을 사용하여 구현을 했습니다. 하지만, 예상치 못한 결과가 지속적으로 출력되었습니다.
SELECT I.item_id, I.item_name, I.rarity
FROM item_info I
INNER JOIN item_tree T ON T.item_id = I.item_id
WHERE I.item_id NOT IN(
SELECT parent_item_id
FROM item_tree
)
ORDER BY I.item_id DESC;
위처럼 작성하니 결과가 다음과 같이 빈 집합을 반환했습니다.

그 다음으로 서브 쿼리에 WHERE 절로 IS NOT NULL 을 추가해준 뒤 결과는 다음과 같습니다.
SELECT I.item_id, I.item_name, I.rarity
FROM item_info I
INNER JOIN item_tree T ON T.item_id = I.item_id
WHERE I.item_id NOT IN(
SELECT parent_item_id
FROM item_tree
WHERE parent_item_id IS NOT NULL
)
ORDER BY I.item_id DESC;

결론부터 말하자면, 두 쿼리의 차이는 NOT IN 구문 내에 NULL 포함 여부입니다. NOT IN 또는 IN 구문에서 NULL이 포함될 경우 비교 결과가 항상 'FALSE'가 나온다고 합니다. 이로 인해서 NULL인 경우를 제외한 결과만 IN 또는 NOT IN 구문에 포함해줘야 합니다!