입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
처음에 내가 의도한 풀이 방법은 'OUTS의 ID가 INS에 없으면 그것을 출력해라' 로 NOT IN
을 사용하고 싶었다.
그래서 다음과 같이 했는데 틀렸다.
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_OUTS B, ANIMAL_INS A
WHERE B.ANIMAL_ID NOT IN A.ANIMAL_ID
ORDER BY B.ANIMAL_ID ASC
NOT IN 뒤에 SELECT절로 INS의 ID를 찾아야했다.
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_OUTS B
WHERE B.ANIMAL_ID NOT IN (SELECT A.ANIMAL_ID FROM ANIMAL_INS A)
ORDER BY B.ANIMAL_ID ASC
JOIN을 이용하는 방법이 정석인 것 같다.
LEFT OUTER JOIN
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_OUTS B
LEFT OUTER JOIN ANIMAL_INS A
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
ORDER BY B.ANIMAL_ID ASC
ANIMAL_OUTS 테이블을 왼쪽에 두고, ANIMAL_INS 테이블을 조회하면 ANIMAL_INS에 없어도 ANIMAL_OUTS이 기준이므로 ANIMAL_OUTS의 ID는 모두 조회가 된다.
이 때 조건이 ANIMAL_INS와 ANIMAL_OUTS의 아이디가 같은 걸 가져오고 싶은데 ANIMAL_INS에는 없는 아이디라면 NULL값으로 연결된다.
따라서 ANIMAL_INS가 NULL값인 것을 조회하면 된다.
RIGHT OUTER JOIN
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_INS A
RIGHT OUTER JOIN ANIMAL_OUTS B
ON B.ANIMAL_ID = A.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
LEFT OUTER JOIN
: 왼쪽 테이블은 무조건 조회. 오른쪽 테이블에 조건이 맞는 것이 있다면 같이 보여줌RIGHT OUTER JOIN
: 오른쪽 테이블은 무조건 조회. 왼쪽 테이블에 조건이 맞는 것이 있다면 같이 보여줌INNER JOIN
: 두 테이블의 공통 부분FULL OUTER JOIN
: 두 테이블의 합집합