본문 바로가기

학습/SQL

[프로그래머스]SQL학습-보호소에서 중성화한 동물

 

✔️ 문제

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

 

✔️ 난이도 LEVEL4
✔️ 분류 JOIN


SQL 문제 풀이

📌 문제 분석

 입소 테이블(ANIMAL_INS)과 출소 테이블(ANIMAL_OUTS)을 동물 ID 기준으로 JOIN한 후,

  • 입소 당시(SEX_UPON_INTAKE) "Intact" 포함 → 중성화되지 않은 상태
  • 출소 당시(SEX_UPON_OUTCOME) "Spayed" 또는 "Neutered" 포함 → 중성화된 상태

위 조건을 만족하는 동물의 ID, 생물 종, 이름을 조회.

 

✔ 해결 방법

  1. ANIMAL_INS(입소 테이블)과 ANIMAL_OUTS(출소 테이블)을 LEFT JOIN
  2. 입소 당시(SEX_UPON_INTAKE)에 **"Intact"**가 포함된 동물 필터링
  3. 출소 당시(SEX_UPON_OUTCOME)에 "Spayed"(암컷 중성화) 또는 "Neutered"(수컷 중성화)가 포함된 동물 필터링
  4. ANIMAL_ID 순으로 정렬
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE,I.NAME
from ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%' AND 
(O.SEX_UPON_OUTCOME LIKE'Spayed%' OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')

✍️ 풀이 정리

🔹 LEFT JOIN 사용

  • ANIMAL_INS(입소 테이블)을 기준으로 ANIMAL_OUTS(출소 테이블)과 동물 ID(ANIMAL_ID) 기준으로 JOIN
  • LEFT JOIN을 사용한 이유는 출소 데이터가 없는 경우를 고려하기 위함

🔹 입소 당시 중성화되지 않은 동물 찾기

WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
  • SEX_UPON_INTAKE가 "Intact Male", "Intact Female" 등으로 되어 있는 데이터 선택

🔹 출소 당시 중성화된 동물 찾기

AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%' OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')
  • SEX_UPON_OUTCOME이 "Spayed Female"(암컷 중성화) 또는 "Neutered Male"(수컷 중성화)인 데이터 선택

🔹 결과 정렬

ORDER BY I.ANIMAL_ID;
  • ANIMAL_ID 기준으로 정렬하여 가독성 높이기

 

✔️ 실행 결과

A382192 Dog Maxwell 2
A410330 Dog Chewy

 

 

✔️  마무리

이 문제에서는 입소 & 출소 데이터 JOIN + 문자열 필터링이 핵심!

  • LEFT JOIN을 활용해 두 테이블을 연결하는 방법
  • LIKE를 활용한 문자열 패턴 검색
  • ORDER BY로 정렬하여 결과 가독성을 높이는 방법