SQL문제풀이(5)

냐옹·2023년 9월 30일
0

SQL

목록 보기
5/18

https://school.programmers.co.kr/learn/courses/30/lessons/59042

SELECT 
o.animal_id as ANIMAL_ID,
o.name as NAME
FROM
animal_ins i
RIGHT OUTER JOIN
animal_outs o
ON 
i.animal_id = o.animal_id
WHERE
i.animal_id is null
ORDER BY
o.animal_id asc;

문풀

이 문제를 풀때는 그림을 그려야 한다.

들어온거랑 나간거랑 집합으로 그림을 그린다. 집합 1, 2라고 하겠다.

그러면 집합 1,2에서 2에만 해당되는 것이니 2에서 1의 차집합이다.

그럼 일단 right outer join을 해준다음에 거기서 1에 해당하는 걸 빼면 된다.

궁금한걸 CHAT GPT에게

질문 : 근데 WHERE i.animal_id IS NULL에서 i.animal_id가 NULL인걸 찾는거잖아. 근데 NULL인데 i.animal_id = o.animal_id이걸 어떻게 수행해?

RIGHT OUTER JOIN이나 LEFT OUTER JOIN이 실행되는 방식을 이해하면 이 문제가 해결됩니다. 이러한 조인은 두 테이블 간에 일치하는 행을 찾아서 연결하고, 일치하지 않는 행에 대해서는 NULL 값을 할당합니다.

예를 들어 i 테이블과 o 테이블이 다음과 같이 있다고 가정해보겠습니다:

i 테이블:

animal_id | name
----------|-----
1         | Dog
3         | Cat

o 테이블:

animal_id | color
----------|------
2         | Brown
3         | Black

RIGHT OUTER JOIN:

SELECT i.animal_id as i_id, o.animal_id as o_id
FROM i
RIGHT OUTER JOIN o ON i.animal_id = o.animal_id;

결과:

i_id | o_id
-----|-----
NULL | 2
3    | 3

이 예시에서, o 테이블의 animal_id 2는 i 테이블에 존재하지 않으므로, i.animal_idNULL이 됩니다. 이후, WHERE i.animal_id IS NULL을 사용하면, i.animal_idNULL인 행, 즉 o 테이블에는 존재하지만 i 테이블에는 존재하지 않는 행을 필터링 할 수 있습니다.

즉, ON i.animal_id = o.animal_id는 먼저 수행되어 조인이 이루어지고, 그 다음 WHERE i.animal_id IS NULL이 수행되어 필터링이 이루어집니다.

0개의 댓글