새소식

Programmers Coding Test/MySQL

[프로그래머스 59411] MySQL - Level3 오랜 기간 보호한 동물(2)

  • -

 

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

 

https://school.programmers.co.kr/learn/courses/30/lessons/59411

 

프로그래머스

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

programmers.co.kr

 

 

1)  문제

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

 

Column 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_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_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문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

 

 

 

 

 

2)  예시

 

예를 들어, ANIMAL_INS 테이블이 아래와 같고

 

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A354597 Cat 2014-05-02 12:16:00 Normal Ariel Spayed Female
A362707 Dog 2016-01-27 12:27:00 Sick Girly Girl Spayed Female
A370507 Cat 2014-10-27 14:43:00 Normal Emily Spayed Female
A414513 Dog 2016-06-07 09:17:00 Normal Rocky Neutered Male

 

 

 

ANIMAL_OUTS 테이블이 다음과 같다면

 

 

 

ANIMAL_ID ANIMAL_TYPE DATETIME NAME SEX_UPON_OUTCOME
A354597 Cat 2014-06-03 12:30:00 Ariel Spayed Female
A362707 Dog 2017-01-10 10:44:00 Girly Girl Spayed Female
A370507 Cat 2015-08-15 09:24:00 Emily Spayed Female

 

 

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

 

 

ANIMAL_ID NAME
A362707 Girly Girl
A370507 Emily

 

 

※ 입양을 간 동물이 2마리 이상인 경우만 입력으로 주어집니다.

 

 

 

 

 

 

 

3)  풀이

 

 

 

1. ANIMAL_INS 테이블을 I, ANIMAL_OUTS 테이블을 O라고 지정합니다.

   두 테이블은 ANIMAL_ID로 연결될 수 있습니다.
   (ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.)

   두 테이블을 RIGHT JOIN하여 ANIMAL_OUTS에 해당하는 부분(입양 보내진 동물)을 사용할 것입니다.

 

● SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS AS I
RIGHT JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID = O.ANIMAL_ID

 

 

 

 

※ JOIN

테이블 간의 연결 작업을 수행하는데 사용되는 키워드

 

JOIN 유형 설명 JOIN 조건
INNER JOIN 두 테이블 사이에서 일치하는 행만 반환합니다. 조건을 ON 절에 지정
LEFT JOIN
(LEFT OUTER JOIN)
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
RIGHT JOIN
(RIGHT OUTER JOIN)
오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
FULL OUTER JOIN 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL 값으로 채워집니다. 조건을 ON 절에 지정
CROSS JOIN 두 테이블의 모든 행을 조합하여 반환합니다. 조건이 필요 없음
NATURAL JOIN 두 테이블 사이에서 칼럼 이름이 동일한 칼럼들을 기반으로 일치하는 행을 반환합니다. 조건이 필요 없음
SELF JOIN 하나의 테이블을 여러 번 사용하여 자체와 조인하는 것을 의미합니다. 별명으로 조인
USING 절 두 테이블 사이에서 일치하는 칼럼들을 지정하여 사용합니다. 조건을 USING 절에 지정

 

 

 

 

 

2. 보호기간이 긴 동물 순서로 나열하여야합니다.
    DATEDIFF 함수를 이용하여 날짜 차이를 계산해주면 됩니다.
    보호소에서 나간날인 O.DATETIME에서 보호소에 들어온 날인 I.DATETIME을 빼주면 되는 것이지요.

    그리고 내림차순 정렬하여 큰 수부터 나열시켜, 보호기간이 긴것부터 나열하고.

    LIMIT 2를 이용하여 값을 2개만 표시되게하면 됩니다.

● ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC LIMIT 2;

 

 

 

 

 

※ RIGHT JOIN해서 우측 테이블인 ANIMAL_OUTS의 정보만 사용하는데 굳이 왜 JOIN을 하는지?

그 이유는 DATEDIFF를 통해 같은 아이디를 가진 동물의 보호기간을 구해주기 위해!

또한, ANIMAL_INS 값은 없고 ANIMAL_OUTS에만 값이 있는 영역은 DATEDIFF 값으로 NULL이 나오고

보호기간 내림차순으로 정렬했을 때, 맨 아래에 위치하게 됩니다.

 

 

 

 

4)  코드

 

SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS AS I
RIGHT JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2;

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.