본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 보호소에서 중성화된 동물

by kime2 2024. 1. 8.
출처

 

문제

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

 

문제에 대한 해석

입양된 동물중 보호소에서 중성화된 동물

 

 

풀이(MYSQL)

with temp as (select outs.animal_id, outs.animal_type, outs.name, ins.sex_upon_intake, outs.sex_upon_outcome
from animal_ins ins right join animal_outs outs on ins.animal_id = outs.animal_id
where ins.animal_id is not null
)
select animal_id,animal_type,name
from temp
where sex_upon_intake in('Intact Female','Intact Male')
and  sex_upon_outcome in('Spayed Female','Neutered Male')
order by animal_id

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. FROM,  WITH절: animal_ins테이블과 animal_outs테이블을 right join하고 animal_ins테이블에 null값을 제거하여 입양된 동물들의 임시테이블을 만든다
  2. WHERE 절: 임시테이블에서 보호시 중성화 상태가 'Intact Female','Intact Male' 중 하나의 경우와 입양시 중성화 상태가 'Spayed Female','Neutered Male'중 하나에 포함되는 동물들을 필터링 하여
  3. SELECT 절: animal_id,animal_type,name을 조회한다
  4. ORDER BY 절: animal_id의 오름차순 순으로 
  5. 결과반환: 보호할때는 중성화가 되지 않았지만 입양시에는 중성화된 동물들을 구할 수 있다

 

다른사람 풀이

SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A
INNER JOIN (
           SELECT ANIMAL_ID, SEX_UPON_OUTCOME
           FROM ANIMAL_OUTS 
           WHERE SEX_UPON_OUTCOME IN('Neutered Male','Spayed Female')
            ) AS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE NOT IN ('Neutered Male','Spayed Female')
ORDER BY 1

 

배운점

  • animal_out테이블에서 원하는 정보(중성화된 동물의 정보)만 가져와 animal_ins테이블과 inner join 가능 -> 조인의 방법은 다양