본문 바로가기
MYSQL

[프로그래머스 LV04] MYSQL 보호소에서 중성화한 동물 🐶🐱

by hello_world.cpp 2025. 5. 19.
728x90
반응형

 

 

SQL로 중성화된 동물 찾기 🐾

https://school.programmers.co.kr/learn/courses/30/lessons/59045

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

오늘은 동물 보호소 데이터를 다루는 SQL 문제를 풀어봤어요!
바로 입소 당시엔 중성화되지 않았지만, 퇴소할 땐 중성화된 동물을 찾아보는 문제였죠.
문제를 제대로 이해하려면 '중성화 여부'의 텍스트를 잘 구분해야 해요!

문제 요약 ✍️

두 개의 테이블 ANIMAL_INSANIMAL_OUTS가 있어요.
- ANIMAL_INS: 동물이 보호소에 들어올 때의 정보
- ANIMAL_OUTS: 동물이 보호소를 나갈 때의 정보

우리는 아래 조건을 만족하는 동물을 찾아야 해요.

  • 입소 당시에는 'Intact' (중성화 X)
  • 퇴소 당시에는 'Neutered' 또는 'Spayed' (중성화 완료)

내가 작성한 SQL 코드 💻

SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID = O.ANIMAL_ID 
WHERE I.SEX_UPON_INTAKE LIKE '%Intact%'
  AND (O.SEX_UPON_OUTCOME REGEXP 'Neutered' OR O.SEX_UPON_OUTCOME REGEXP 'Spayed')
ORDER BY I.ANIMAL_ID;

코드 설명 🙋🏻‍♀️

이제 코드를 한 줄씩 찬찬히 뜯어볼게요!

  • SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
    👉 최종적으로 보여줄 컬럼 3개를 선택했어요.
    동물의 ID, 종류(개/고양이 등), 이름만 출력!
  • FROM ANIMAL_INS I
    👉 입소 테이블 ANIMAL_INS를 기준으로 조회를 시작해요.
  • JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
    👉 입소 기록과 퇴소 기록을 ANIMAL_ID로 연결!
    같은 동물의 입소와 퇴소 정보를 합쳐서 봐야 하니까요.
  • WHERE I.SEX_UPON_INTAKE LIKE '%Intact%'
    👉 입소 당시 성별+중성화 상태 중에서, 중성화되지 않은 동물만 걸러줘요.
    (예: Intact Male, Intact Female)
  • AND (O.SEX_UPON_OUTCOME REGEXP 'Neutered' OR O.SEX_UPON_OUTCOME REGEXP 'Spayed')
    👉 반대로 퇴소할 땐 중성화된 상태인 경우만 필터링!
    정규표현식 REGEXP을 이용해서 'Neutered'나 'Spayed'가 들어간 값을 골라요.
  • ORDER BY I.ANIMAL_ID
    👉 결과는 동물 ID 기준으로 정렬해서 보기 좋게 출력되도록 했습니다.

정리하며 ✨

이 문제는 단순히 JOIN만 하는 게 아니라, 문자열 안에서 조건을 판별해야 하는 게 포인트였어요.
특히 중성화 상태가 문자열로 되어 있어서, LIKE와 REGEXP 같은 텍스트 조건이 아주 중요했죠!

비슷한 문제를 만나면, 데이터의 의미를 제대로 파악하고 조건을 정확히 걸어주는 연습을 계속해야겠다고 느꼈어요.
그리고 무엇보다도, SQL에서 JOIN은 이제 정말 필수 스킬이니 계속 연습해보자구요 🔥

💡 재미있게 읽어주셔서 감사합니다! 다음 문제 풀이에서 또 만나요 🐾

728x90
반응형

댓글