My SQL / sublime
문제: 없어진 기록 찾기
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 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
몰랐던 문법
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가 기준임을 상기했던 것 같다.
'데이터 분석 > SQL 연습문제' 카테고리의 다른 글
코테 연습 21일차 (프로그래머스 SQL 고득점 Kit) (0) | 2022.02.27 |
---|---|
코테 연습 20일차 (프로그래머스 SQL 고득점 Kit) (0) | 2022.02.26 |
코테 연습 18일차 (프로그래머스 SQL 고득점 Kit) (0) | 2022.02.23 |
코테 연습 17일차 (프로그래머스 SQL 고득점 Kit) (0) | 2022.02.22 |
코테 연습 16일차 (프로그래머스 SQL 고득점 Kit) (0) | 2022.02.21 |
댓글