https://programmers.co.kr/learn/courses/30/lessons/59044
코딩테스트 연습 - 오랜 기간 보호한 동물(1)
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디
programmers.co.kr
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_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_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 |
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
예시
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면
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 |
A373687 | Dog | 2014-03-20 12:31:00 | Normal | Rosie | Spayed Female |
A412697 | Dog | 2016-01-03 16:25:00 | Normal | Jackie | Neutered Male |
A413789 | Dog | 2016-04-19 13:28:00 | Normal | Benji | Spayed Female |
A414198 | Dog | 2015-01-29 15:01:00 | Normal | Shelly | Spayed Female |
A368930 | Dog | 2014-06-08 13:20:00 | Normal | Spayed Female |
ANIMAL_OUTS
ANIAML_ID | ANIMAL_TYPE | DATETIME | NAME | SEX_UPON_OUTCOME |
A354597 | Cat | 2014-05-02 12:16:00 | Ariel | Spayed Female |
A373687 | Dog | 2014-03-20 12:31:00 | Rosie | Spayed Female |
A368930 | Dog | 2014-06-13 15:52:00 | Spayed Female |
SQL문을 실행하면 다음과 같이 나와야 합니다.
NAME | DATETIME |
Shelly | 2015-01-29 15:01:00 |
Jackie | 2016-01-03 16:25:00 |
Benji | 2016-04-19 13:28:00 |
※ 입양을 가지 못한 동물이 3마리 이상인 경우만 입력으로 주어집니다.
[풀이]
조회할 데이터의 조건
1. 아직 입양을 못 간 동물
2. 가장 오래 보호소에 있었던 동물
3. 1, 2를 만족하는 동물 3마리
4. 이름과 보호 시작일을 조회
3. 결과는 보호 시작일 순으로 조회
↓
1. ANIMAL_OUTS 테이블은 입양 간 동물의 정보를 담고 있으므로, ANIMAL_INS 테이블의 동물의 아이디가 ANIMAL_OUTS 테이블의 동물의 아이디 컬럼에 존재하지 않으면 아직 입양을 못 간 동물인 것이다.
=> WHERE절에 조건으로 작성
2. 가장 오래 보호소에 있는 동물은 테이블을 보호 시작일 순으로 정렬하면 보호소에 오래 있는 순서가 된다.
=> ORDER BY절에 작성
3. 정렬된 데이터 중 3마리의 동물만 조회해야 하므로 LIMIT 3을 이용하여 상위 3개 데이터만 조회될 수 있도록 한다.
=> 마지막에 LIMIT 작성
4. 이름과 보호 시작일을 조회할 것인데 이는 ANIMAL_INS 테이블에 존재할 값
=> SELECT절에 조회할 컬럼, FROM절에 조회할 테이블 작성
우선 값을 조회할 테이블 ANIMAL_INS를 FROM절에 작성하고, 조회할 컬럼인 NAME, DATETIME을 SELECT절에 작성한다.
ANIMAL_ID가 ANIMAL_INS 테이블에 존재하고 ANIMAL_OUTS 테이블에는 존재하지 않는 값을 찾기 위해서는 서브 쿼리를 이용해야 한다. WHERE절에 ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS) 를 작성하면 서브쿼리 (SELECT ANIMAL_ID FROM ANIMAL_OUTS)에서 ANIMAL_OUTS 테이블에 존재하는 모든 ANIMAL_ID가 조회되게 된다. ANIAML_ID NOT IN을 통해 ANIMAL_INS 테이블의 모든 ANIMAL_ID 중 서브 쿼리에서 조회한 값에 존재하지 않는 값들만 조건을 통과하게 된다.
가장 오래 보호소에 있는 동물 3마리를 조회하기 위해 보호 시작일 순으로 정렬해야 한다. 이는 ORDER BY절에 DATETIME을 작성하면 된다.
상위 N개의 데이터만 조회하는 LIMIT N을 이용해 상위 3개의 레코드인 가장 오래 보호소에 존재하는 3마리 동물을 조회할 것이다. 따라서 LIMIT 3을 작성한다.
[코드]
SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3
'SQL > 프로그래머스' 카테고리의 다른 글
[프로그래머스/SQL] 루시와 엘라 찾기(MySQL) (0) | 2021.11.06 |
---|---|
[프로그래머스/SQL] 보호소에서 중성화한 동물(MySQL) (0) | 2021.10.31 |
[프로그래머스/SQL] 있었는데요 없었습니다(MySQL) (0) | 2021.10.31 |
[프로그래머스/SQL] NULL 처리하기(MySQL) (0) | 2021.10.30 |
[프로그래머스/SQL] 없어진 기록 찾기(MySQL) (0) | 2021.10.30 |