강의로 돌아가기
김성재

parent_item_id 에 대한 NULL 체크가 필요한 이유 (feat. NOT IN 구문의 동작 구조)

# 각 아이템들은 오직 하나의 PARENT 아이템 ID 를 가진다
# ROOT 아이템의 PARENT 아이템 ID 는 NULL
# 더 이상 업그레이드할 수 없는 아이템 정보(ITEM_ID, ITEM_NAME, RARITY)를 출력

SELECT item_id, item_name, rarity
FROM ITEM_INFO
WHERE item_id NOT IN (
    SELECT DISTINCT(parent_item_id)
    FROM ITEM_TREE
    WHERE parent_item_id IS NOT NULL
)
ORDER BY 1 desc

parent_item_id 에 대한 NULL 체크를 하지 않을 경우 아무런 결과값이 나오지 않는 것을 확인할 수 있을 것입니다.
여기서 주목할 부분은 NOT IN 구문의 동작 구조인데요.

먼저 IN에 대해 살펴보면, IN은 뒤따라 괄호로 주어지는 값들 중 하나라도 == 비교를 만족하면 해당 데이터를 출력합니다.
즉, OR 연산과 같습니다.

그러나, NOT IN은 뒤따라 괄호로 주어지는 값들 모두에 대해 != 비교를 만족해야 해당 데이터를 출력합니다.
즉, AND 연산과 같습니다.
예를 들어, NOT IN (1, 2, NULL) 일 경우 데이터가 출력되려면 1도 아니고 2도 아니고 NULL도 아니어야 한다는 뜻입니다.

아직 의문이 풀리지 않을 수 있습니다.
"item_id NOT IN (1, 2, NULL) 일 경우, item_id가 3이면 해당 데이터는 출력되어야 하는 것이 아니냐"
해답의 실마리는 NULL과의 비교는 무조건 false이다에 있습니다.
따라서 3은 1도 아니고 2도 아니고 NULL도 아니라고 할지라도 "논리학적"으로 접근했을 때 3과 NULL의 비교 결과값이 false 이기 때문에 NOT IN의 AND 연산에서 결과적으로 false가 되어 아무런 데이터도 반환되지 못하게 됩니다.

  • 이동준

    명쾌한 설명이네요 궁금했는데 감사합니다

    이동준―2024.04.06 10:47
  • 김성재

    도움이 됐다니 기쁩니다.

    김성재―2024.04.10 20:59
  • ahndh428@gmail.com

    감사합니다. 제가 갖고 있던 의문을 정확히 설명해주셨네요.

    ahndh428@gmail.com―2024.04.25 17:57
  • 선혜

    👍👍👍

    선혜―2024.05.06 21:15
  • KMK

    감사합니다

    KMK―2024.05.07 21:38
  • 박성우

    감사합니다

    박성우―2024.05.10 13:44
  • dhsfid02@gmail.com

    감사합니다

    dhsfid02@gmail.com―2024.09.22 23:03
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.