SQL 고득점 Kit - 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_IDANIMAL_INSANIMAL_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 문을 작성해주세요.
👉 문제 보러가기


✔️ 문제 풀이

(1) Pseudo-Code

1. ANIMAL_INS과 ANIMAL_OUTS에 NULL 값이 포함되어 있다.
2. 두 테이블에 대해 중성화 정보가 들어있는 항목을 결합하기 위해 INNER JOIN을 사용한다.
3. JOIN으로 테이블을 결합할 땐 ID를 기준으로 한다.
4. 조건문에 ANIMAL_INS 중성화 되지 않은 경우를 넣기 위해 LIKE문을 사용한다.
5. 조건문에 ANIMAL_OUTS 중성화가 된 경우를 넣기 위해 Spayed, Neutered를 포함하는 정규표현식을 작성한다.

(2) 코드 작성

SELECT T1.ANIMAL_ID, T1.ANIMAL_TYPE, T1.NAME
FROM ANIMAL_INS AS T1
 INNER JOIN ANIMAL_OUTS AS T2 ON T1.ANIMAL_ID = T2.ANIMAL_ID
WHERE T1.SEX_UPON_INTAKE LIKE 'Intact%'
  AND T2.SEX_UPON_OUTCOME REGEXP '^[Spayed|Neutered]'

(3) 코드 리뷰 및 회고

  • 두 테이블에서 같은 동물에 대해 중성화 여부의 변경사항(X->O)를 확인하기 위해 JOIN을 사용했다.
  • T1(보호소에 들어온 동물 정보)에선 Intract로 시작되는 데이터만 불러오기 위해 LIKE 연산자와 % 와일드카드를 사용했다.
  • T2(입양 보낸 동물 정보)에선 Spayed 또는 Neutered로 시작되는 데이터만 불러오기 위해 정규표현식을 사용해 한 줄로 표현했다.
    • 정규표현식을 사용하지 않았다면 아래 코드와 같이 작성할 수 있다.
    • (T2.SEX_UPON_OUTCOME LIKE 'Spayed%' OR T2.SEX_UPON_OUTCOME LIKE 'Neutered%')


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기