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에 해당하는 걸 빼면 된다.
RIGHT OUTER JOIN
이나 LEFT OUTER JOIN
이 실행되는 방식을 이해하면 이 문제가 해결됩니다. 이러한 조인은 두 테이블 간에 일치하는 행을 찾아서 연결하고, 일치하지 않는 행에 대해서는 NULL
값을 할당합니다.
예를 들어 i
테이블과 o
테이블이 다음과 같이 있다고 가정해보겠습니다:
animal_id | name
----------|-----
1 | Dog
3 | Cat
animal_id | color
----------|------
2 | Brown
3 | Black
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_id
는 NULL
이 됩니다. 이후, WHERE i.animal_id IS NULL
을 사용하면, i.animal_id
가 NULL
인 행, 즉 o
테이블에는 존재하지만 i
테이블에는 존재하지 않는 행을 필터링 할 수 있습니다.
즉, ON i.animal_id = o.animal_id
는 먼저 수행되어 조인이 이루어지고, 그 다음 WHERE i.animal_id IS NULL
이 수행되어 필터링이 이루어집니다.