✔️ 문제
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
✔️ 난이도 LEVEL4
✔️ 분류 JOIN
SQL 문제 풀이
📌 문제 분석
입소 테이블(ANIMAL_INS)과 출소 테이블(ANIMAL_OUTS)을 동물 ID 기준으로 JOIN한 후,
- 입소 당시(SEX_UPON_INTAKE) "Intact" 포함 → 중성화되지 않은 상태
- 출소 당시(SEX_UPON_OUTCOME) "Spayed" 또는 "Neutered" 포함 → 중성화된 상태
위 조건을 만족하는 동물의 ID, 생물 종, 이름을 조회.
✔ 해결 방법
- ANIMAL_INS(입소 테이블)과 ANIMAL_OUTS(출소 테이블)을 LEFT JOIN
- 입소 당시(SEX_UPON_INTAKE)에 **"Intact"**가 포함된 동물 필터링
- 출소 당시(SEX_UPON_OUTCOME)에 "Spayed"(암컷 중성화) 또는 "Neutered"(수컷 중성화)가 포함된 동물 필터링
- 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로 정렬하여 결과 가독성을 높이는 방법
'학습 > SQL' 카테고리의 다른 글
[프로그래머스]SQL학습 - 저자 별 카테고리 별 매출액 집계하기 (2) | 2025.02.25 |
---|---|
[프로그래머스]SQL학습 - 취소되지 않은 진료 예약 조회하기 (1) | 2025.02.25 |
[프로그래머스]SQL학습 - 5월 식품들의 총매출 조회하기 (0) | 2025.02.24 |
[프로그래머스] SQL학습 - 식품 분류 별 가장 비싼 식품의 정보 조회하기 (0) | 2025.02.24 |
[프로그래머스]SQL학습 - 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2025.02.21 |