1. 문제
2. 문제 풀기 전에,
- ANIMAL_INS 👉🏻 X
- ANIMAL_OUTS 👉🏻 동물 ID, 이름 조회
- 입양을 간 기록은 있지만, 보호소에 들어온 기록이 없는 동물 조회
- 동물 ID ASC
- JOIN의 종류와 그 개념 생각하기
3. 테이블
ANIMAL_INS AS I
ANIMAL_OUTS AS O
4. 풀이 과정
1단계) 먼저 테이블 I와 테이블 O를 이용하여 쿼리문을 작성하기 위해 JOIN을 해줘야 하는데, 이번에는 조금 다르게 생각해 볼 필요가 있다.
👨🏻🏫 INNER JOIN은 테이블들을 연결할 때 기본적으로 가장 많이 사용되는 형태이다.
‘보호소에 들어온 기록은 없지만, 입양을 간 기록은 있는’ 동물을 찾아야 하는데, '입양 간 기록 테이블 - 보호소 들어온 기록 테이블'로 계산이 가능하다.
▶ 두 테이블의 교집합은 제외하고 ANIMAL_OUTS 테이블에만 해당되는 데이터를 조회하기 위해 RIGHT OUTER JOIN을 적용해야 한다.
SELECT
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID=O.ANIMAL_ID
2단계) 교집합 제외를 위해 WHERE절에 ANIMAL_INS 테이블은 IS NULL 처리를 해준다.
그러면 위 그림에서와 같이 ‘ANIMAL_OUTS 테이블에서 ANIMAL_INS 테이블을 뺀 값(B-A)’을 구할 수 있다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
3단계) 테이블 O의 동물 ID와 이름을 조회하는 쿼리문을 작성해 준다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
4단계) ORDER BY절을 이용하여 문제에서 제시한 방식으로 정렬해 준다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;
5. 완성코드
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;
🔗 관련 링크
프로그래머스 문제 - https://school.programmers.co.kr/learn/courses/30/lessons/59042
JOIN 종류 정리 - https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/
'Skills > SQL' 카테고리의 다른 글
프로그래머스: 업그레이드 된 아이템 구하기 (MySQL) (0) | 2024.03.07 |
---|---|
프로그래머스: 주문량이 많은 아이스크림들 조회하기 (MySQL) (0) | 2024.03.05 |
프로그래머스: 저자 별 카테고리 별 매출액 집계하기 (MySQL) (0) | 2024.03.03 |
프로그래머스: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (MySQL) (0) | 2024.03.02 |
프로그래머스: 조건에 부합하는 중고거래 댓글 조회하기 (MySQL) (1) | 2024.02.29 |