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 i
→ animal_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
→ 최종적으로 필요한 컬럼만 출력합니다.



