본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 62> 보호소에서 중성화한 동물(Lv.4)

by HYEHYE_SON 2024. 2. 16.
728x90

 

프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지


 

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

 

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

 

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

 

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

문제

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
( 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다 )

예시

예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

 

[ ANIMAL_INS ]

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A367438 Dog 2015-09-10 16:01:00 Normal Cookie Spayed Female
A382192 Dog 2015-03-13 13:14:00 Normal Maxwell 2 Intact Male
A405494 Dog 2014-05-16 14:17:00 Normal Kaila Spayed Female
A410330 Dog 2016-09-11 14:09:00 Sick Chewy Intact Female

 

[ ANIMAL_OUTS ]

ANIMAL_ID ANIMAL_TYPE DATETIME NAME SEX_UPON_OUTCOME
A367438 Dog 2015-09-12 13:30:00 Cookie Spayed Female
A382192 Dog 2015-03-16 13:46:00 Maxwell 2 Neutered Male
A405494 Dog 2014-05-20 11:44:00 Kaila Spayed Female
A410330 Dog 2016-09-13 13:46:00 Chewy Spayed Female

 

  • Cookie는 보호소에 들어올 당시에 이미 중성화되어있었습니다
  • Maxwell 2는 보호소에 들어온 후 중성화되었습니다
  • Kaila는 보호소에 들어올 당시에 이미 중성화되어있었습니다
  • Chewy는 보호소에 들어온 후 중성화되었습니다

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_ID ANIMAL_TYPE NAME
A382192 Dog Maxwell 2
A410330 Dog Chewy

 

 

본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.


이 문제는 
EQUI JOIN과 IN
위 2가지를 사용하여 해결할 수 있다.

Oracle , MySQL 공통


♥ 정답 

select o.animal_id, o.animal_type, o.name
    from animal_ins i, animal_outs o
    where o.animal_id = i.animal_id
        and i.sex_upon_intake in ('Intact Female', 'Intact Male')
        and o.sex_upon_outcome not in ('Intact Female', 'Intact Male')
    order by o.animal_id asc;

 


 

■ EQUI JOIN 사용

두 컬럼에 동일한 데이터를 가지는 컬럼이 존재할 때 사용할 수 있는 조인방법

- 두 테이블에서 동일한 데이터를 가지는 컬럼명을 WHERE절에서 연결조건으로 사용


정답 해설

위의 내용을 기반으로 해설해보면,

 

-- SELECT절

출력해야할 컬럼인 ANIMAL_ID, ANIMAL_TYPE, NAME을 입력해주는데,

컬럼을 가져올 테이블 명 혹은 테이블의 별칭을

온점(.)을 사용하여 컬렴과 연결해준다.

 

 

-- FROM절

조인할 테이블 명인 ANIMAL_INS와 ANIMAL_OUTS를 기입해주고,

컬럼명 앞에 편하게 명시해주기 위해서 별칭을 넣어준다. 

 

 

-- WHERE절

 

< 연결조건 >

WHERE에 두 테이블을 연결해줄 공동된 컬럼을

equl join을 사용해서 join조건을 준다.

 

animal_outs의 animal_id는 animal_ins의 animal_id의 외래키이기 때문에

animal_id를 공통된 컬럼으로하여 연결조건을 주면 된다.

 

< 일반조건 1 >

보호소에 들어올 당시에 중성화되지 않은 동물에 대해서 찾기 위해 조건이 필요하다.

 

연결조건에 and로 일반조건을 연결해주는데, 

animal_ins테이블의 sex_upon_intake 컬럼의 데이터 중

중성화를 거치지 않은 동물을 조건으로 아래와 같이 설정해준다.

 

 and i.sex_upon_intake in ('Intact Female', 'Intact Male')

 

in을 사용해줬지만

like와 와일드카드를 이용해서 출력할 수 있다.

 

< 일반조건 2 >

보호소를 나갈 당시에는 중성화된 동물에 대해서 찾기 위해 조건이 필요하다.

 

일반조건 1도 충족하고 일반조건 2의 조건도 충족해야하기 때문에

and로 조건을 연결해주고 추가적인 조건을 준다.

 

animal_outs 테이블의 sex_upon_outcome 컬럼의 데이터 중

중성화를 거친 동물의 조건을 아래와 같이 설정해준다.

 

and o.sex_upon_outcome not in ('Intact Female', 'Intact Male')

 

 

-- ORDER BY 절

ANIMAL_ID를 기준으로 ASC하게 정렬해준다.

 


 

 

 

 

 

 

 

출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형