보호소에서 중성화한 동물
JOIN
보호소에서 중성화한 동물
문제 설명
다음은 동물 보호소에서 관리하는 정보를 담은 ANIMAL_INS 테이블과 동물 보호소에서 입양 보낸 동물의 정보를 담은 ANIMAL_OUTS 테이블입니다.
ANIMAL_INS 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물 ID |
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 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물 ID |
ANIMAL_TYPE | VARCHAR(N) | FALSE | 생물 종 |
DATETIME | DATETIME | FALSE | 입양일 |
NAME | VARCHAR(N) | TRUE | 동물의 이름 |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE | 입양 시의 성별 및 중성화 여부 |
문제
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화 되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
풀이 과정
- 조건 확인
- 입양되지 못한 동물만 찾기 위해
ANIMAL_OUTS
에 해당 동물의 기록이 없는 경우를 필터링해야 함 - Intact는 중성화되지 않은 상태를 의미함
- 보호소에서 나갈 당시
SEX_UPON_OUTCOME
이Spayed
또는Neutered
로 시작함 - Spayed는 암컷 중성화, Neutered는 수컷 중성화를 의미함
- 입양되지 못한 동물만 찾기 위해
- 테이블 결합 (JOIN)
- 두 테이블을
ANIMAL_ID
를 기준으로 INNER JOIN - INNER JOIN 사용 이유 : 입양 기록이 있는 동물만 조회하면 되기 때문
- 두 테이블을
- 조건 필터링
SEX_UPON_INTAKE
LIKE ‘Intact%’ 사용해서 보호소에 들어올 당시 중성화되지 않은 동물만을 필터링SEX_UPON_OUTCOME
LIKE ‘Spayed%’ ORSEX_UPON_OUTCOME
LIKE ‘Neutered%’`사용해서 보호소에서 나갈 때 중성화된 동물만을 필터링
- 결과 정렬
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- ORDER BY
ANIMAL_ID
ASC로 동물의 ID 기준으로 오름차순 정렬
- ORDER BY
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 최종 출력
- SELECT 절에서 동물의 ID(
ANIMAL_ID
), 생물 종(ANIMAL_TYPE
), 이름(NAME
) 출력
- SELECT 절에서 동물의 ID(
- 교훈
- WHERE AND 조건에 괄호로 잘 묶어라..
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
AI.ANIMAL_ID,
AI.ANIMAL_TYPE,
AI.NAME
FROM
ANIMAL_INS AI
JOIN
ANIMAL_OUTS AO
ON
AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE
AI.SEX_UPON_INTAKE LIKE 'Intact%'
AND (AO.SEX_UPON_OUTCOME LIKE 'Spayed%' OR AO.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY
AI.ANIMAL_ID ASC;
Tip
중성화 여부 필터링
- 보호소에 들어올 당시 중성화되지 않은 동물은
SEX_UPON_INTAKE
컬럼이 Intact로 시작되며- 보호소에서 나갈 때 중성화된 동물은 Spayed 또는 Neutered로 시작함
- 이를 위해 LIKE 연산자를 사용하여 필터링
SQL Dialect Used: Oracle
개념 확인
- INNER JOIN
- 두 테이블의 공통된 컬럼을 기준으로 데이터를 연결
- 양쪽 테이블 모두에 일치하는 행만 결과에 포함됨
- LIKE 연산자
- 문자열의 특정 패턴이 일치하는 데이터를 찾을 때 LIKE 연산자 사용
- %는 0개 이상의 문자를 대체하는 와일드카드
Useful link
This post is licensed under Park Juyoung by the author.