준호씨의 블로그

Programmers - SQL - JOIN 문제들 풀어보기 본문

개발이야기/PS - Problem Solving, 알고리즘

Programmers - SQL - JOIN 문제들 풀어보기

준호씨 2021. 3. 27. 23:51
반응형

 

 

 

Programmers - SQL - IS NULL 문제들 풀어보기

Programmers - SQL - GROUP BY 문제들 풀어보기 Programmers - SQL - SUM, MAX, MIN 문제들 풀어보기 Programmers - SQL - SELECT 문제들 풀어보기 프로그래머스에서 SQL문제들 중 SELECT 문제들을 풀어 보았습니..

junho85.pe.kr

지난번엔 IS NULL 문제들을 풀어 보았고 이번에는 JOIN 문제들을 풀어봅니다.

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

이번 문제들은 최저 난이도가 3입니다.

 

없어진 기록 찾기

 

코딩테스트 연습 - 없어진 기록 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 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

 

있었는데요 없었습니다

 

코딩테스트 연습 - 있었는데요 없었습니다

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

입양일이 잘못 입력된 데이터가 있습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회합니다. 보호 시작일이 빠른 순으로 조회합니다.

일단 두 테이블에 모두 존재하는 정보로만 조회해야 합니다. 교집합을 구해야 하므로 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)

 

코딩테스트 연습 - 오랜 기간 보호한 동물(1)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

아직 입양을 못 간 동물 중, 보호소에 가장 오래 있었던 동물 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_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

보호소에 들어올 당시에는 중성화되어 있지 않았으나, 입양 보낼 때는 중성화된 상태의 동물을 찾습니다. 아이디와 생물 종, 이름을 조회하고 아이디 순으로 정렬합니다.

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
반응형
Comments