Home

오랜 기간 보호한 동물(1)

Link

Tables

Question

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

DataFlow

ins, out의 리스트 차이

Answer

select name, datetime from animal_ins where animal_id not in (select animal_id from ANIMAL_OUTS) order by datetime asc limit 3;
SQL
복사

Intention

방식
특징
NOT IN
NULL 위험, 소규모엔 무난
NOT EXISTS
NULL 안전, 대용량에서 일반적으로 더 빠름
LEFT JOIN IS NULL
가장 직관적이고 인덱스 친화적
SELECT i.name, i.datetime FROM animal_ins i WHERE NOT EXISTS ( SELECT 1 FROM animal_outs o WHERE o.animal_id = i.animal_id -- 행 단위 매칭이므로 NULL 영향 없음 ) ORDER BY i.datetime ASC LIMIT 3;
SQL
복사

각 단계 상세 설명

FROM animal_ins ianimal_ins 전체 행을 하나씩 꺼낼 준비를 합니다.
WHERE NOT EXISTS (...) → ①에서 꺼낸 행 하나(i) 를 들고 서브쿼리로 들어갑니다.
sql
- i의 현재 행 animal_id를 가지고 OUTS 테이블을 탐색SELECT 1FROM animal_outs o WHERE o.animal_id = i.animal_id - ← i가 행마다 바뀜 (상관 서브쿼리)
매칭되는 행이 있으면 → EXISTS = TRUE → NOT EXISTS = FALSE → 해당 행 제외
매칭되는 행이 없으면 → EXISTS = FALSE → NOT EXISTS = TRUE → 해당 행 유지
이 과정을 animal_ins모든 행에 대해 반복합니다.
ORDER BY i.datetime ASC → ②를 통과한 행들(입양 안 된 동물들)을 입소일 오래된 순으로 정렬합니다.
LIMIT 3 → 정렬된 결과에서 상위 3행만 남깁니다.
SELECT i.name, i.datetime → 최종적으로 필요한 컬럼만 출력합니다.