[SQL] 연습

[mysql] 프로그래머스 보호소에서 중성화한 동물

Simon Yoon 2022. 7. 17. 23:48

오늘은 프로그래머스 sql 문제 중에 '보호소에서 중성화한 동물' 문제에 대해서 풀어보도록 하겠습니다.

문제 난이도는 Level 4 문제이고 JOIN을 사용하면 풀 수 있다고 합니다.

문제 풀이에 사용한 언어는 mysql입니다. 이제 문제를 확인해 보겠습니다.

 

 

문제

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다.

보호소에 들어올 당시에는 중성화되지 않았지만,

보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는

아이디 순으로 조회하는 SQL 문을 작성해주세요.

(중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact,

중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다.)

 

풀이과정

일단 두 가지 큰 조건이 있습니다.

1. 보호소에 들어올 당시에는 중성화가 되어 있지 않다.

2. 보호소를 나갈 당시에는 중성화가 되었다.

 

각각 한 조건씩 생각해본다면,

1. 보호소를 들어올 당시에는 중성화 X → 보호소를 들어올 당시이므로  ANIMAL_INS  테이블을 사용해야 할 것이고,

 ANIMAL_INS  테이블의  SEX_UPON_INTAKE  컬럼의 값이  'Intact'  가 들어있어야 할 것입니다. 이를 코드로 표현해보자면,

SELECT *
from animal_ins
where sex_upon_intake like '%intact%'

이와 같이 표현할 수 있을 것입니다.

 

2. 보호소를 나갈 당시에는 중성화 O → 보호소를 나갈 당시이므로  ANIMAL_OUTS  테이블을 사용해야 할 것이고,

 ANIMAL_OUTS  테이블의  SEX_UPON_OUTCOME  컬럼의 값이  'neutered'  나  'spayed'  가 포함되어야 할 것입니다.

이를 코드로 표현해보자면,

SELECT *
from animal_outs
where sex_upon_outcome like '%spayed%'
or sex_upon_outcome like  '%neutered%'

 

마지막으로 앞에서 확인해 본 두 테이블을  inner join  으로  animal_id  를 기준으로 결합하면, 두 가지 조건이 모두 만족하는 테이블이 생성될 것입니다.

그렇게 생성된 결과에서 추가적인 조건에 맞게 animal_id, animal_type, name 컬럼을 출력해주면 될 것입니다.

그래서 최종적으로는 아래와 같은 코드를 작성할 수 있습니다.

SELECT ins.animal_id, ins.animal_type, ins.name
    from 
        (SELECT *
        from animal_ins
        where sex_upon_intake like '%intact%') ins
    inner join
        (SELECT *
        from animal_outs
        where sex_upon_outcome like '%spayed%'
        or sex_upon_outcome like  '%neutered%') outs
    on ins.animal_id = outs.animal_id
;