https://school.programmers.co.kr/learn/courses/30/lessons/59042
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
LEFT OUTER JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID
입양을 간 기록이 있으나 보호소에 들어온 기록이 없다는 것은 ANIMAL_OUTS에만 존재하고 ANIMAL_INS에는 없는 동물의 데이터를 의미한다. 다이어그램으로 보자면 아래와 같다.
A영역에 있다면 보호소에 들어온 기록만 있는 경우이고(만약 유실되지 않았다면), C영역의 데이터는 보호소에 들어온 기록과 나간 기록이 모두 있는경우(유실되지 않음)이다. 입양을 간 기록은 있으나 보호소에 들어온 기록이 없는 경우는 B영역이다. B영역만의 데이터를 추출하기 위해서 OUTER JOIN을 사용했다.
아래 이미지에서 다이어그램 상 경우의 수 별로 JOIN문 조건을 어떻게 줘야할 지 참고할 수 있다. 나는 ANIMAL_OUTS테이블을 먼저 두고 LEFT OUTER JOIN을 사용해 풀었지만 이미지에서 보다시피 ANIMAL_INS테이블을 먼저 두고 LEFT OUTER JOIN을 사용해도 결과는 동일하다.