출처
문제
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 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 ->결과반환
- FROM, WITH절: animal_ins테이블과 animal_outs테이블을 right join하고 animal_ins테이블에 null값을 제거하여 입양된 동물들의 임시테이블을 만든다
- WHERE 절: 임시테이블에서 보호시 중성화 상태가 'Intact Female','Intact Male' 중 하나의 경우와 입양시 중성화 상태가 'Spayed Female','Neutered Male'중 하나에 포함되는 동물들을 필터링 하여
- SELECT 절: animal_id,animal_type,name을 조회한다
- ORDER BY 절: animal_id의 오름차순 순으로
- 결과반환: 보호할때는 중성화가 되지 않았지만 입양시에는 중성화된 동물들을 구할 수 있다
다른사람 풀이
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 가능 -> 조인의 방법은 다양
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 조건별로 분류하여 주문상태 출력하기 (2) | 2024.01.08 |
---|---|
[문제풀이] 조건에 맞는 도서와 저자 리스트 출력 (1) | 2024.01.08 |
[문제풀이] 오랜 기간 보호한 동물(2)-datediff (0) | 2024.01.05 |
[문제풀이] 있었는데 없습니다-datediff (0) | 2024.01.05 |
[문제풀이] 상품별 오프라인 매출 구하기 - 다른사람 풀의 해석 필요 (1) | 2024.01.05 |