프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지
문제 설명
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 |
문제
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
( 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다 )
예시
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면
[ ANIMAL_INS ]
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A367438 | Dog | 2015-09-10 16:01:00 | Normal | Cookie | Spayed Female |
A382192 | Dog | 2015-03-13 13:14:00 | Normal | Maxwell 2 | Intact Male |
A405494 | Dog | 2014-05-16 14:17:00 | Normal | Kaila | Spayed Female |
A410330 | Dog | 2016-09-11 14:09:00 | Sick | Chewy | Intact Female |
[ ANIMAL_OUTS ]
ANIMAL_ID | ANIMAL_TYPE | DATETIME | NAME | SEX_UPON_OUTCOME |
A367438 | Dog | 2015-09-12 13:30:00 | Cookie | Spayed Female |
A382192 | Dog | 2015-03-16 13:46:00 | Maxwell 2 | Neutered Male |
A405494 | Dog | 2014-05-20 11:44:00 | Kaila | Spayed Female |
A410330 | Dog | 2016-09-13 13:46:00 | Chewy | Spayed Female |
- Cookie는 보호소에 들어올 당시에 이미 중성화되어있었습니다
- Maxwell 2는 보호소에 들어온 후 중성화되었습니다
- Kaila는 보호소에 들어올 당시에 이미 중성화되어있었습니다
- Chewy는 보호소에 들어온 후 중성화되었습니다
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
ANIMAL_ID | ANIMAL_TYPE | NAME |
A382192 | Dog | Maxwell 2 |
A410330 | Dog | Chewy |
본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.
이 문제는
EQUI JOIN과 IN
위 2가지를 사용하여 해결할 수 있다.
Oracle , MySQL 공통
♥ 정답
select o.animal_id, o.animal_type, o.name
from animal_ins i, animal_outs o
where o.animal_id = i.animal_id
and i.sex_upon_intake in ('Intact Female', 'Intact Male')
and o.sex_upon_outcome not in ('Intact Female', 'Intact Male')
order by o.animal_id asc;
■ EQUI JOIN 사용
두 컬럼에 동일한 데이터를 가지는 컬럼이 존재할 때 사용할 수 있는 조인방법
- 두 테이블에서 동일한 데이터를 가지는 컬럼명을 WHERE절에서 연결조건으로 사용
정답 해설
위의 내용을 기반으로 해설해보면,
-- SELECT절
출력해야할 컬럼인 ANIMAL_ID, ANIMAL_TYPE, NAME을 입력해주는데,
컬럼을 가져올 테이블 명 혹은 테이블의 별칭을
온점(.)을 사용하여 컬렴과 연결해준다.
-- FROM절
조인할 테이블 명인 ANIMAL_INS와 ANIMAL_OUTS를 기입해주고,
컬럼명 앞에 편하게 명시해주기 위해서 별칭을 넣어준다.
-- WHERE절
< 연결조건 >
WHERE에 두 테이블을 연결해줄 공동된 컬럼을
equl join을 사용해서 join조건을 준다.
animal_outs의 animal_id는 animal_ins의 animal_id의 외래키이기 때문에
animal_id를 공통된 컬럼으로하여 연결조건을 주면 된다.
< 일반조건 1 >
보호소에 들어올 당시에 중성화되지 않은 동물에 대해서 찾기 위해 조건이 필요하다.
연결조건에 and로 일반조건을 연결해주는데,
animal_ins테이블의 sex_upon_intake 컬럼의 데이터 중
중성화를 거치지 않은 동물을 조건으로 아래와 같이 설정해준다.
and i.sex_upon_intake in ('Intact Female', 'Intact Male')
in을 사용해줬지만
like와 와일드카드를 이용해서 출력할 수 있다.
< 일반조건 2 >
보호소를 나갈 당시에는 중성화된 동물에 대해서 찾기 위해 조건이 필요하다.
일반조건 1도 충족하고 일반조건 2의 조건도 충족해야하기 때문에
and로 조건을 연결해주고 추가적인 조건을 준다.
animal_outs 테이블의 sex_upon_outcome 컬럼의 데이터 중
중성화를 거친 동물의 조건을 아래와 같이 설정해준다.
and o.sex_upon_outcome not in ('Intact Female', 'Intact Male')
-- ORDER BY 절
ANIMAL_ID를 기준으로 ASC하게 정렬해준다.
출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
'SQL 문제 풀기 > 1. 프로그래머스 SQL : 2023.12.17~2024.2.29' 카테고리의 다른 글
<프로그래머스 64> 5월의 식품들의 총매출 조회하기(Lv.4) (0) | 2024.02.18 |
---|---|
<프로그래머스 63> 식품분류별 가장 비싼 식품의 정보 조회하기(Lv.4) (2) | 2024.02.17 |
<프로그래머스 61> 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(Lv.3) (0) | 2024.02.15 |
<프로그래머스 60> 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기(Lv.3) (2) | 2024.02.14 |
<프로그래머스 59> 헤비 유저가 소유한 장소(Lv.3) (2) | 2024.02.13 |