준호씨의 블로그
Programmers - SQL - JOIN 문제들 풀어보기 본문
지난번엔 IS NULL 문제들을 풀어 보았고 이번에는 JOIN 문제들을 풀어봅니다.
이번 문제들은 최저 난이도가 3입니다.
없어진 기록 찾기
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회합니다.
left outer join을 이용합니다. animal_outs를 left 테이블로 정하고 animal_ins 테이블과 join 합니다. animal_outs 테이블을 기준으로 데이터가 나오며 입양(animal_ins)의 정보가 없는 경우 입양정보는 null로 표시됩니다. 그래서 animal_ins정보가 null인 내역을 찾으면 됩니다.
select animal_outs.animal_id, animal_outs.name
from animal_outs left join animal_ins
on animal_outs.animal_id = animal_ins.animal_id
where animal_ins.animal_id is null
있었는데요 없었습니다
입양일이 잘못 입력된 데이터가 있습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회합니다. 보호 시작일이 빠른 순으로 조회합니다.
일단 두 테이블에 모두 존재하는 정보로만 조회해야 합니다. 교집합을 구해야 하므로 inner join을 이용합니다. 그리고 보호 시작일이 입양일 보다 큰 데이터를 찾습니다.
select animal_outs.animal_id, animal_outs.name
from animal_outs join animal_ins
on animal_outs.animal_id = animal_ins.animal_id
where animal_ins.datetime > animal_outs.datetime
order by animal_ins.datetime
오랜 기간 보호한 동물(1)
아직 입양을 못 간 동물 중, 보호소에 가장 오래 있었던 동물 3마리의 이름과 보호 시작일을 조회합니다. 보호 시작일 순으로 조회합니다.
일단 입양 나간 동물은 빼야 되니 animal_ins에서 animal_outs를 빼야 됩니다. 여기에는 몇 가지 방법이 있습니다. left join 하고 animal_outs가 null인 데이터만 사용하는 방법, not in (sub query)를 사용하는 방법이 있습니다. oracle이라면 minus문을 사용하는 방법도 있습니다만 mysql에는 minus문은 없습니다.
저는 첫 번째 방법인 animal_ins는 left테이블로 해서 animal_outs와 left join 한 다음 animal_outs가 null인 데이터를 조회하는 방식을 사용했습니다. 그리고 order by datetime으로 보호 시작일 순으로 정렬하고 limit 3로 가장 오래 있었던 동물 3마리를 뽑아내었습니다.
select animal_ins.name, animal_ins.datetime
from animal_ins left join animal_outs
on animal_ins.animal_id = animal_outs.animal_id
where animal_outs.animal_id is null
order by datetime
limit 3
보호소에서 중성화한 동물
보호소에 들어올 당시에는 중성화되어 있지 않았으나, 입양 보낼 때는 중성화된 상태의 동물을 찾습니다. 아이디와 생물 종, 이름을 조회하고 아이디 순으로 정렬합니다.
animal_ins, animal_outs 둘 다 있는 동물을 대상으로 하므로 일단 inner join으로 교집합을 구합니다. 그리고 animal_ins의 sex_upon_intake가 'Intact Male'이거나 'Intact Female'인 동물을 찾습니다. 그리고 animal_outs의 sex_upon_outcome이 'Neutered Male', 'Spayed Female'인 동물을 찾으면 됩니다.
select animal_ins.animal_id, animal_ins.animal_type, animal_ins.name
from animal_outs join animal_ins
on animal_ins.animal_id = animal_outs.animal_id
where animal_ins.sex_upon_intake in ('Intact Male', 'Intact Female')
and animal_outs.sex_upon_outcome in ('Neutered Male', 'Spayed Female')
order by animal_id
'개발이야기 > PS - Problem Solving, 알고리즘' 카테고리의 다른 글
Programmers - SQL - String, Date 문제들 풀어보기 (0) | 2021.03.28 |
---|---|
Programmers - SQL - IS NULL 문제들 풀어보기 (0) | 2021.03.26 |
Programmers - SQL - GROUP BY 문제들 풀어보기 (0) | 2021.03.25 |
Programmers - SQL - SUM, MAX, MIN 문제들 풀어보기 (0) | 2021.03.24 |
Programmers - SQL - SELECT 문제들 풀어보기 (1) | 2021.03.21 |