문제 링크
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME,SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다.
ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
테이블
ANIMAL_INS
ANIMAL_OUTS
문제 결과
예를 들어 ANIMAL_INS 테이블이
ANIMAL_OUTS 테이블이 이와 같다면.
- Allie의 ID는 ANIMAL_INS에 없으므로, Allie의 데이터는 유실되었습니다.
- Gia의 ID는 ANIMAL_INS에 있으므로, Gia의 데이터는 유실되지 않았습니다.
- Spice의 ID는 ANIMAL_INS에 없으므로, Spice의 데이터는 유실되었습니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
접근 방법
- SQL 문의 조회 명령어 SELECT문에서 ANIMAL_ID,NAME을 출력해야 한다.
- ANIMAL_INS와 ANIMAL_OUTS에 동일한 이름의 속성이 존재하여 AS로 별칭을 주어 분류하였습니다.
- 입양 간 기록(ANIMAL_OUTS)에 있는데 보호소에 들어온 기록(ANIMAL_INS)에 없는 ANIMAL_ID를 찾는 문제로 해석하였습니다.
- ANIMAL_OUTS에 LEFT OUTER JOIN ANIMAL_INS를 하였습니다.
LEFT OUTER JOIN
테이블명 LEFT OUTER JOIN 테이블명 ON 조건
LEFT OUTER JOIN은 왼쪽에 있는 테이블을 기준으로 조건에 맞게 JOIN(속성들이 합쳐짐)이 진행되며 왼쪽에 있는 속성들에서 조건에 만족하는 오른쪽 테이블 값이 존재하지 않을 경우 NULL로 취급하여 합쳐진다.
예시.
SELECT * FROM ANIMAL_OUTS AS A LEFT OUTER JOIN ANIMAL_INS AS B ON A.ANIMAL_ID = B.ANIMAL_ID
일부 결과(검은색 네모칸은 NULL)
- JOIN했을 때 NULL값이 있는 행이 입양 기록은 있지만 보호소에 들어간 기록이 없는 기록으로 볼 수 있습니다. 그래서 WHERE(조건)문에 B.ANIMAL_ID IS NULL을 넣어서 해결하였습니다.
결과 코드
SELECT A.ANIMAL_ID,A.NAME FROM ANIMAL_OUTS AS A LEFT OUTER JOIN ANIMAL_INS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL;
'Mysql' 카테고리의 다른 글
프로그래머스 SQL 고득점 Kit (JOIN) 오랜 기간 보호한 동물(1) (0) | 2021.11.09 |
---|---|
프로그래머스 SQL 고득점 Kit (JOIN) 있었는데요 없었습니다 (0) | 2021.11.09 |
프로그래머스 SQL 고득점 Kit (IS NULL) NULL 처리하기 (0) | 2021.11.08 |
프로그래머스 SQL 고득점 Kit (IS NULL) 이름이 있는 동물의 아이디 (0) | 2021.11.08 |
프로그래머스 SQL 고득점 Kit (IS NULL) 이름이 없는 동물의 아이디 (0) | 2021.11.08 |
댓글