출처
문제
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
문제에 대한 해석
보호소에 들어온 동물 중 입양되지 않은 동물들을 찾아 날짜순으로 계산하는 것이 목표입니다
풀이(MYSQL)
select ins.name, ins.datetime
from animal_ins ins left join animal_outs outs on ins.animal_id = outs.animal_id
where outs.animal_id is null
order by ins.datetime
limit 3
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- FROM 절과 LEFT JOINW절: 쿼리는 먼저 'animal_ins'와 'animal_outs'을 animal_id기준으로 left조인합니다.
- WHERE 절: 보호는 되었으나 입양되지 않는 동물일 경우 animal_outs테이블에서 null값으로 조회되기 때문에 animal_outs에서 animal_id 가 NULL값인 동물만 필터링 합니다.
- SELECT 절: 보호는 되었으나 입양되지 않는 동물의 데이터에서 이름과 보호시작일만 조회합니다
- ORDER BY: 날짜를 내림차순으로 조회하여 오래된 날짜 > 최신 순으로 조회합니다.
- 결과반환: LIMIT를 통해 오래된 3마리의 이름, 보호시작일의 결과가 반환됩니다.
배운점
- A LEFT JOIN B의 경우A테이블을 기준으로 조인되어 A테이블에는 B테이블에 데이터가 없을 경우 B테이블의 데이터는 NULL값으로 출력된다. 즉, 보호되어 animal_ins테이블에는 있지만 입양되지 않아 animal_outs테이블에 데이터가 없는 동물들을 찾을 수 있다.
- 테이블 별칭을 줄때 함수에 사용되는 이름은 쓸 수 없다.(animal_ins AS in 으로는 사용불가)
질문
EXCEPT로도 풀 수 있을까?
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 오랜 기간 보호한 동물(2)-datediff (0) | 2024.01.05 |
---|---|
[문제풀이] 있었는데 없습니다-datediff (0) | 2024.01.05 |
[문제풀이] 상품별 오프라인 매출 구하기 - 다른사람 풀의 해석 필요 (1) | 2024.01.05 |
[문제풀이] 카테고리 별 도서 판매량 집계 (1) | 2024.01.04 |
[Question] 서브쿼리와 JOIN-완 (0) | 2024.01.03 |