[2025.12.01] 오늘의 학습 키워드 - SQL 감 잡기

허진원·2025년 12월 1일

내일배움캠프 TIL

목록 보기
25/41

벌써 12월 달이 되었다! 분명 내일배움캠프에 입소한 지 얼마 지나지 않았을텐데???

올해는 유독 시간이 빠르게 지나간 것만 같은 기분이 든다. 주변 지인들도, 가족들도 같은 생각인 듯 입을 모아 "올해는 시간이 참 빠르네"라고 말한다.

연말인지라 송년회 모임도 참석해야 하고, 내년 계획도 짜고 하고 싶은 게 참 많다. 아직 올해는 한 달 정도 남았으니, 그 동안 천천히 계획도 세우고, 열심히 코딩 공부도 진행하고, 아무튼 최선을 다해서 이번 년도를 충실하게 마무리하고 싶다.

  1. 오늘 학습 키워드
    SQL 쿼리 작성 감 되찾기
  1. 오늘 학습한 내용 나만의 언어로 정리하기
    오늘은 한 동안 하지 못 했던 SQL 쿼리 작성하는 법을 다시 한 번 상기시키는 과정을 밟아보았다. 데이터 테이블 전체를 조회하는 것부터 조건을 달아 데이터를 필터링하는 약간의 심화 과정까지 간단하게 진행해보았다.

다소 오래간만에 SQL을 다루는 것이다보니, 처음에는 조금 버벅였지만, 다시 금방 적응하고 나름 빠르게 쿼리를 작성할 수 있게 되었다.

  1. 학습 내용
    간단한 내용은 건너뛰고, 가장 집중한 문제를 풀이하도록 하겠다.

문제는 다음과 같다.

다음의 두 데이터테이블은 동물 보호소에서 가지고 있는 동물들의 정보를 담은 테이블입니다. 천재지변으로 인해 데이터 일부가 유실되었습니다. 이 테이블을 가지고, 입양을 간 기록은 있지만 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요. (문제 출처 : 프로그래머스 코딩테스트)

  1. ANIMAL_INS
  1. 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으로 적용해도 같은 값이 나온다.

  1. 학습하며 느낀 점
    파이썬만 하다가 SQL을 하게 되니, 뭔가 고향에 돌아온 듯한 기분이었다. 어색한 듯 익숙한 쿼리 작성법을 더듬으며 되짚어갔다. 나중에는 SQL과 파이썬 둘 다 자연스럽게 사용하게 되겠지만, 아직은 SQL이 더 편한 감이 있다.
    (파이썬도 편하게 느낄 수 있도록 노력을 많이 해야한다는 뜻이겠구나 싶긴 하다.)

마치며 : 내일부터는 다시 튜터님께 무엇인가를 배우는 시간을 가지게 된다. 지각하지 말고, 간단한 것이라도 몰입해서 배울 수 있도록 마음가짐을 다듬고 수업을 듣도록 하자.

profile
국문과 전공 데이터 입문자

0개의 댓글