벌써 12월 달이 되었다! 분명 내일배움캠프에 입소한 지 얼마 지나지 않았을텐데???
올해는 유독 시간이 빠르게 지나간 것만 같은 기분이 든다. 주변 지인들도, 가족들도 같은 생각인 듯 입을 모아 "올해는 시간이 참 빠르네"라고 말한다.
연말인지라 송년회 모임도 참석해야 하고, 내년 계획도 짜고 하고 싶은 게 참 많다. 아직 올해는 한 달 정도 남았으니, 그 동안 천천히 계획도 세우고, 열심히 코딩 공부도 진행하고, 아무튼 최선을 다해서 이번 년도를 충실하게 마무리하고 싶다.
다소 오래간만에 SQL을 다루는 것이다보니, 처음에는 조금 버벅였지만, 다시 금방 적응하고 나름 빠르게 쿼리를 작성할 수 있게 되었다.
문제는 다음과 같다.
다음의 두 데이터테이블은 동물 보호소에서 가지고 있는 동물들의 정보를 담은 테이블입니다. 천재지변으로 인해 데이터 일부가 유실되었습니다. 이 테이블을 가지고, 입양을 간 기록은 있지만 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요. (문제 출처 : 프로그래머스 코딩테스트)
- ANIMAL_INS
- ANIMAL_OUTS
이 문제는 두 개의 데이터 테이블을 join으로 결합하여 조건에 맞는 데이터를 정제하는 문제이다. 이 때 주의해야 할 점은 "입양을 간 기록은 있지만 보호소에 들어온 기록이 없을 수 있다"는 것이다.
즉 이 문제에서는 inner join으로 "두 테이블이 모두 데이터를 가지고 있는 경우"를 조회해야 하는 것이 아니라, outer join으로 "두 테이블이 모두 데이터를 가지지 않는 경우도 포함"해서 조회해야 한다.
그럼 이 둘을 left join으로 결합해서 전체 데이터를 먼저 조회해보자.
SELECT *
from ANIMAL_INS as ai
left join ANIMAL_OUTS as ao
on ai.ANIMAL_ID = ao.ANIMAL_ID
;
위 사진과 같이 데이터가 조회되었다.
그런데 조금 이상하다. 분명 데이터가 없는 것은 보호되었던 동물인데, 데이터 조회 결과는 입양을 보낸 동물에 빈 값이 보인다.
우리에게 필요한 데이터는 보호되었던 동물의 기록이 없는 경우이기 때문에, 기준이 되는 테이블을 ANIMAL_OUTS 테이블로 다시 설정하고 조회해보면,
SELECT *
from ANIMAL_OUTS as ao
left join ANIMAL_INS as ai
on ai.ANIMAL_ID = ao.ANIMAL_ID
order by ao.ANIMAL_ID
;
우리에게 필요한 데이터가 제대로 출력된 것을 확인할 수 있다.
이제 필터링 조건이었던 "입양을 간 기록은 있지만 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회"하도록 where절을 작성해보자.
SELECT ao.ANIMAL_ID,
ao.NAME
from ANIMAL_OUTS as ao
left join ANIMAL_INS as ai
on ai.ANIMAL_ID = ao.ANIMAL_ID
where ai.ANIMAL_ID is null
order by ao.ANIMAL_ID
;
조건 중 "입양을 간 기록은 있지만 보호소에 들어온 기록이 없는" 경우는 쉽게 말해 값이 null인 경우를 뜻한다. 따라서 보호 기록 테이블인 ANIMAL_INS의 ID가 null인 경우를 찾도록 "ai.ANIMAL_ID is null"을 where절에 입력한다.
그리고 조회하고자 하는 컬럼인 "동물의 ID"와 "이름"을 select절에 적고, 마지막으로 정렬 조건인 "ID 순으로 조회"를 order by절에 적용하면,
SELECT ao.ANIMAL_ID,
ao.NAME
from ANIMAL_OUTS as ao
left join ANIMAL_INS as ai
on ai.ANIMAL_ID = ao.ANIMAL_ID
where ai.ANIMAL_ID is null
order by ao.ANIMAL_ID
;
이런 쿼리문이 완성된다.
쿼리문 실행 결과
참고로 ANIMAL_INS와 ANIMAL_OUTS의 위치를 바꾼 후, left join이 아니라 right join으로 적용해도 같은 값이 나온다.
마치며 : 내일부터는 다시 튜터님께 무엇인가를 배우는 시간을 가지게 된다. 지각하지 말고, 간단한 것이라도 몰입해서 배울 수 있도록 마음가짐을 다듬고 수업을 듣도록 하자.