본문 바로가기
데이터 분석/SQL 연습문제

코테 연습 19일차 (프로그래머스 SQL 고득점 Kit)

2022. 2. 24.

My SQL / sublime

문제: 없어진 기록 찾기

 

코딩테스트 연습 - 없어진 기록 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

예시

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

ANIMAL_INS

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A352713 Cat 2017-04-13 16:29:00 Normal Gia Spayed Female
A350375 Cat 2017-03-06 15:01:00 Normal Meo Neutered Male

ANIMAL_OUTS

ANIMAL_ID ANIMAL_TYPE DATETIME NAME SEX_UPON_OUTCOME
A349733 Dog 2017-09-27 19:09:00 Allie Spayed Female
A352713 Cat 2017-04-25 12:25:00 Gia Spayed Female
A349990 Cat 2018-02-02 14:18:00 Spice Spayed Female

ANIMAL_OUTS 테이블에서

  • Allie의 ID는 ANIMAL_INS에 없으므로, Allie의 데이터는 유실되었습니다.
  • Gia의 ID는 ANIMAL_INS에 있으므로, Gia의 데이터는 유실되지 않았습니다.
  • Spice의 ID는 ANIMAL_INS에 없으므로, Spice의 데이터는 유실되었습니다.

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

ANIMAL_ID NAME
A349733 Allie
A349990 Spice

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


풀이

다음부터는 문제 읽기 시작부터 정답까지 계속 녹화를 해볼까..

제출한 오답 1

-- 코드를 입력하세요
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_INS RIGHT OUTER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID

-> ANIMAL_OUTS 테이블을 기준으로 RIGHT OUTER JOIN을 해줘야 한다고 생각했는데.. 문제가 원하는건 입양기록(ANIMAL_OUTS)과 입소기록(ANIMAL_INS)을 매칭하는게 아니라 입소기록(ANIMAL_INS)이 없는 데이터였다. 그렇다면 입양과 입소기록이 매칭되는 데이터를 ANIMAL_OUTS에서 빼면 될 것 같다.

제출한 오답 2

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
EXCEPT
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS

-> SQLD 공부할 때 배웠던 EXCEPT 집합 연산자를 사용하고자 했다. 그렇지만 MYSQL에는 없는 문법이고 아래와 같은 에러가 났다.

SQL 실행 중 오류가 발생하였습니다.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXCEPT
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS' at line 4

몰랐던 문법

 

SQL에서 집합 연산자(SET OPERATOR) 활용하기 - YA-Hwang 기술 블로그

SQL로 집합 연산자(SET OPERATOR) 활용하는 법을 알아본다.

yahwang.github.io

EXCEPT와 INTERSECT 개념을 활용하기 위해 JOIN 연산을 활용한다.

INTERSECT

모든 컬럼을 key로 INNER JOIN을 실행하면 간단히 해결할 수 있다.

SELECT a.col1, a.col2, 
FROM table1 a JOIN table2 b
    ON a.col1 = b.col1 AND a.col2 = B.col2


EXCEPT
LEFT(RIGHT) JOIN을 실행하면 한쪽 테이블에 존재하지 않는 ROW에 대해 null 값이 생긴다. 이 NULL 값만을 WHERE 절에서 포함하면 된다
SELECT a.col1, a.col2, 
FROM table1 a LEFT JOIN table2 b
    ON a.col1 = b.col1 AND a.col2 = b.col2
WHERE b.x IS NULL;

출처: SQL에서 집합 연산자(SET OPERATOR) 활용하기

다시 제출한 답

-- 코드를 입력하세요
SELECT a.ANIMAL_ID, a.NAME
FROM ANIMAL_OUTS a LEFT OUTER JOIN ANIMAL_INS b ON a.ANIMAL_ID = b.ANIMAL_ID
WHERE b.ANIMAL_ID IS NULL
ORDER BY a.ANIMAL_ID

-> 약간의 시행착오를 거쳤지만 성공! 계속 ANIMAL_OUTS가 기준임을 상기했던 것 같다. 

2022.02.24

 

댓글