[SQL] IN, NOT IN 내부에 NULL이 있다면?

Kim Hyen Su·2024년 8월 16일

SQL

목록 보기
11/15
post-thumbnail

개요

프로그래머스 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 구문에 포함해줘야 합니다!

profile
백엔드 서버 엔지니어

0개의 댓글