출처
문제
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요.
이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.
문제에 대한 해석
입양을 간 동물 중 보호기간이 가장 길었던 동물 두마리
풀이(MYSQL)
with temp as (
select outs.animal_id, outs.name, datediff(outs.datetime,ins.datetime) dates
from animal_outs outs left join animal_ins ins on outs.animal_id = ins.animal_id
where ins.animal_id is not null
)
select animal_id, name
from temp
order by dates desc
limit 2
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- FROM,JOIN,WITH 절: animal_outs와 animal_ins를 animal_id를 기준으로 left join한다. 보호는 되었지만 입양이 안될 경우 null값으로 나오기 때문에 null제외한 아이디, 이름과 입양일과 보호일의 차이(dates)를 조회하여 임시테이블을 만든다
- SELECT 절: 임시 테이블에서 아이디와 이름을 조회한다
- ORDER BY 절: 조회한 데이터를 입양일과 보호일의 차이가 큰순으로 조회한다
- 결과반환: 2명까지만 알기위해 limit를 사용하여 입양일과 보호일의 차이 큰 아이디와 이름을 구한다
다른사람 풀이
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME IS NOT NULL
ORDER BY B.DATETIME - A.DATETIME DESC
LIMIT 2
배운점
- with절을 사용한다고 꼭 가독성이 높아지는건 아니다(다른사람 풀이가 더 보기 좋음)
- left join의 사용성(기준이 되는 컬럼에 없는 데이터를 제거하기 위해: 보호테이블에는 있지만 입양테이블에는 없는 아이디를 제거하기 위해)
- datediff(a,b)와 (a-b)가 동일할까? 순서는 동일할 수 있으니 의미는 애매..(oracle에서는 동일하다고 한다)
- mysql에서 null값은 제일 우선에 위치시킨다(oracle은 반대)
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 조건에 맞는 도서와 저자 리스트 출력 (1) | 2024.01.08 |
---|---|
[문제풀이] 보호소에서 중성화된 동물 (1) | 2024.01.08 |
[문제풀이] 있었는데 없습니다-datediff (0) | 2024.01.05 |
[문제풀이] 상품별 오프라인 매출 구하기 - 다른사람 풀의 해석 필요 (1) | 2024.01.05 |
[문제풀이] 카테고리 별 도서 판매량 집계 (1) | 2024.01.04 |