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

[문제풀이] 오랜 기간 보호한 동물(1)

by kime2 2024. 1. 4.
출처

 

문제

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 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 ->결과반환

 

  1. FROM 절과 LEFT JOINW절: 쿼리는 먼저 'animal_ins'와 'animal_outs'을 animal_id기준으로 left조인합니다. 
  2. WHERE 절: 보호는 되었으나 입양되지 않는 동물일 경우 animal_outs테이블에서 null값으로 조회되기 때문에 animal_outs에서 animal_id 가 NULL값인 동물만 필터링 합니다. 
  3. SELECT 절: 보호는 되었으나 입양되지 않는 동물의 데이터에서 이름과 보호시작일만 조회합니다
  4. ORDER BY: 날짜를 내림차순으로 조회하여 오래된 날짜 > 최신 순으로 조회합니다.
  5. 결과반환: LIMIT를 통해 오래된 3마리의 이름, 보호시작일의 결과가 반환됩니다.

 

배운점

  1. A LEFT JOIN B의 경우A테이블을 기준으로 조인되어 A테이블에는 B테이블에 데이터가 없을 경우 B테이블의 데이터는 NULL값으로 출력된다. 즉, 보호되어 animal_ins테이블에는 있지만 입양되지 않아 animal_outs테이블에 데이터가 없는 동물들을 찾을 수 있다.
  2. 테이블 별칭을 줄때 함수에 사용되는 이름은 쓸 수 없다.(animal_ins AS in 으로는 사용불가)

 

질문

EXCEPT로도 풀 수 있을까?