본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 50> 있었는데요 없었습니다.(Lv.3)

by HYEHYE_SON 2024. 2. 4.
728x90

 

프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지


 

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_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

 


문제

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

예시

예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

 

[ ANIMAL_INS ]

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A350276 Cat 2017-08-13 13:50:00 Normal Jewel Spayed Female
A381217 Dog 2017-07-08 09:41:00 Sick Cherokee Neutered Male

 

[ ANIMAL_OUTS ]

ANIMAL_ID ANIMAL_TYPE DATETIME NAME SEX_UPON_OUTCOME
A350276 Cat 2018-01-28 17:51:00 Jewel Spayed Female
A381217 Dog 2017-06-09 18:51:00 Cherokee Neutered Male

 

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

ANIMAL_ID NAME
A381217 Cherokee

 

 

본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.


♥ 정답

select i.animal_id, i.name
    from animal_ins i, animal_outs o
    where i.animal_id = o.animal_id
    and i.datetime > o.datetime
    order by i.datetime asc;

 

 

오라클, MySQL 공통 해설

EQUI JOIN 사용

두 테이블에 동일한 컬럼(ANIMAL_ID)이 존재하기 때문에

EQUI JOIN을 사용해서 JOIN을 할 수 있다.


# 1. SELECT절

출력해줘야 하는 컬럼명인 동물의 아이디(animal_id)와 동물의 이름(name)을 나열해주는데,

각 컬럼명 앞에 해당 컬럼명이 속하는 테이블 명과 온점(.)으로 연결해준다.

(두 테이블 간 동일 컬럼명을 사용하는게 아니라면 작성해주지 않아도 된다)

 

ex 1) animal_ins.animal_id 

ex 2) i.animal_id → animal_ins 테이블의 별칭이 i인 경우

 

 

# 2. FROM절

조인할 두 테이블을 작성해주는데, 

컬럼명 앞에 넣어주기 편하게 별칭을 설정해준다.

 

 

# 3. WHERE절

 

--연결조건

두 테이블의 동일한 컬럼(animal_id)을 EQUI 조인 연결 조건으로 사용해준다.

 

--일반조건

보호 시작일(i.datetime)보다 입양일(o.datetime)이 

더 빠른 동물에 대한 데이터를 출력해야하기 때문에 조건을 넣어줘야한다.

 

※ 날짜 비교할 때 주의사항

날짜가 더 빠른 것 = 날짜 중 작은 것 

날짜가 더 느린 것 = 날짜 중 큰 것

 

따라서 보호 시작일보다 입양일이 더 빠르다는 말은

보호 시작일이 입양일 보다 더 큼 = 입양일이 보호시작일 보다 작음

 

 


 

결과 출력

 

 

 

출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형