[SQL] 프로그래머스 SQL 고득점 kit (7)

이정진·2021년 10월 17일
0

SQL

목록 보기
7/23
post-thumbnail

오랜 기간 보호한 동물(1)

SQL 구분 : JOIN

문제

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의 외래 키입니다.

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

문제 풀이

이전 JOIN 문제들과 다르게 입양을 못 간 동물 중 파악을 해야 하는 문제이므로, ANIMAL_INS 테이블에 ANIMAL_OUTS 테이블을 LEFT JOIN하여 조회하도록 SQL을 작성하면 된다.
문제에서의 핵심은 "가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하라"이므로, ORDER BY문에 ANIMAL_INS.DATETIME ASC를 통해 정렬하였으며, 3행만 출력하라고 하였으므로, LIMIT 3을 통해 출력 행수를 지정하였다.

SQL

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 ANIMAL_INS.DATETIME ASC
LIMIT 3

보호소에서 중성화한 동물

SQL 구분 : JOIN

문제

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의 외래 키입니다.

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

문제 풀이

들어올 때 중성화 수술이 진행되지 않은 상태에서, 나갈 때 중성화 수술이 완료되어 있어야 한다고 하였으므로, ANIMAL_INS에 ANIMAL_OUTS RIGHT JOIN을 시켰다. 이후, ANIMAL_INS의 중성화 수술 칼럼에서 중성화 수술을 하지 않은 경우, "Intact"가 포함되므로 와일드 카드인 %를 앞 뒤에 붙여 LIKE문으로 조회 할 수 있도록 하였고, ANIMAL_OUTS의 중성화 수술 칼럼에서 중성화 수술을 한 경우, 성별에 따라 "Spayed"와 "Neutered"로 구분되므로, 이를 OR문을 활용하여 묶은 뒤, ANIMAL_INS 조건과 AND로 연결하였다.

SQL

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME
FROM ANIMAL_INS
RIGHT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.SEX_UPON_INTAKE LIKE "%Intact%" AND (ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE "%Spayed%" OR ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE "%Neutered%")
ORDER BY ANIMAL_INS.ANIMAL_ID ASC

0개의 댓글