이 SQL쿼리 문제는 동물 보호소에 들어온 동물 중 보호소를 나간 동물의 기록이 없는 동물들을 오래된 순으로 찾아내라는 문제다.
문제의 주요 포인트로 JOIN이 적혀있었다.
문제 설명
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
ANIMAL_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마리 이상인 경우만 입력으로 주어집니다.
문제풀이
SELECT
i.NAME,
i.DATETIME
FROM
ANIMAL_INS i
LEFT JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE
o.ANIMAL_ID is NULL
ORDER BY
i.DATETIME ASC
LIMIT
3;
LEFT JOIN을 사용하여 테이블을 연결 하고 'NULL' 인 경우를 필터링하여 보호소를 나가지 않은 동물을 찾는다.
반환된 값에 들어온 시간을 오래된 순으로 정렬해주고 LIMIT를 걸어 3마리만 SELECT해준다.
문제에서 3마리만 출력하라고 되어 있음으로 잊지말고 LIMIT를 해줘야한다.
이런 쿼리문을 이용하면 들어오고 나가는 데이터의 정보를 파악할 수 있는 것같다.
WHERE절에 NULL필터링을 통해 ANIMAL_INS에만 속하는 동물만 반환하는 것을 보고,
쿼리문으로 합집합 - 교집합 값 찾는 법을 알게된 것 같다.
'프로그래머스 풀이' 카테고리의 다른 글
[javascript]음양 더하기 (1) | 2024.03.11 |
---|---|
[javascript]짝수와 홀수 (0) | 2024.03.08 |
[javascript]최솟값 만들기 (3) | 2024.02.28 |
[c++] 완전 탐색_카펫 (0) | 2024.02.26 |
[lv.1] 약수의 합(c++) (0) | 2024.02.23 |