본문 바로가기
Database

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

by 진홍이 2021. 7. 17.
728x90

보호소에서 중성화한 동물

 

문제

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

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

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다.
보호소에 들어올 당시에는 중성화되지 않았지만,
보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는
아이디 순으로 조회하는 SQL 문을 작성해주세요.

예시

문제에서 원하는것은

  • SELECT로 ANIMAL_ID, ANIMAL_TYPE, NAME만 조회
  • JOIN을 사용해 두 테이블 조회
  • WHERE을 사용해 보호소에 들어올 당시에는 중성화되지 않았지만,
    보호소를 나갈 당시에는 중성화된 동물을 조회
  • ANIMAL_ID순으로 조회

이렇게 4가지 입니다.

 

바로 작성해 보도록 하겠습니다.

 

우선 이전 문제 들에서 JOIN을 활용하는 법을 알았으니

2021.07.14 - [Database] - [프로그래머스 SQL - JOIN] 없어진 기록 찾기

 

[프로그래머스 SQL - JOIN] 없어진 기록 찾기

없어진 기록 찾기 문제 ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SE..

dev-crimson.tistory.com

WHERE만 작성하면 완료일듯 싶습니다.

 

문제의 예시를 살펴보니

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

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

 

그대로 WHERE문으로 바꾸어 보겠습니다.

WHERE
    ANIMAL_INS.SEX_UPON_INTAKE LIKE 'Intact%' # 들어올때의 동물은 중성화를 거치지 않은 동물
    AND # 그리고
    (
        ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE 'Spayed%' # 나갈때 동물은 중성화를 한'Spayed'가 문자에 포함된 동물
        OR # 또는
        ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE 'Neutered%'# 나갈때 동물은 중성화를 한'Neutered'가 문자에 포함된 동물
    )

WHERE을 작성한 그대로 해석하면

 

들어올때의 동물의 중성화는 '중성화를 거치지 않은 동물'

그리고

(나갈때 동물은 중성화를 한'Spayed'가 문자에 포함된 동물

또는

나갈때 동물은 중성화를 한'Neutered'가 문자에 포함된 동물)

 

입니다.

 

'AND'와 'OR' 그리고 'LIKE'를 사용하여

문제 그대로 WHERE로 바꾸어 보았습니다.

 

이후의 쿼리는 늘 해왔던 것처럼

JOIN을 사용하여 두 테이블을 묶어주고

ANIMAL_ID순으로 정렬만 하면 끝입니다.

SELECT 
    INS.ANIMAL_ID,
    INS.ANIMAL_TYPE,
    INS.NAME
FROM 
    ANIMAL_INS INS
LEFT JOIN
    ANIMAL_OUTS OUTS
    ON
    INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE
    INS.SEX_UPON_INTAKE LIKE 'Intact%'
    AND
    (
        OUTS.SEX_UPON_OUTCOME LIKE 'Spayed%'
        OR
        OUTS.SEX_UPON_OUTCOME LIKE 'Neutered%'
    )
ORDER BY 
    INS.ANIMAL_ID

완료입니다.

 

출처:[프로그래머스 코딩테스트 연습] - https://programmers.co.kr/learn/courses/30/lessons/59045

728x90