문제 풀이/SQL

[SQL/my sql] [programmers] 없어진 기록 찾기

일 월 2023. 3. 11. 22:44

https://school.programmers.co.kr/learn/courses/30/lessons/59042

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


문제 설명

ANIMAL_INS 테이블동물 보호소에 들어온 동물의 정보를 담은 테이블

 

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 테이블동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

 

NAME   TYPE NULLABLE
ANIMAL_ID 동물의 아이디
(ANIMAL_INS의 ANIMAL_ID의 외래 키)
VARCHAR(N) FALSE
ANIMAL_TYPE 생물 종 VARCHAR(N) FALSE
DATETIME 입양일 DATETIME FALSE
NAME 이름 VARCHAR(N) TRUE
SEX_UPON_INTAKE 성별 및 중성화 여부 VARCHAR(N) FALSE

 

 

입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름ID 순으로 조회하는 SQL문 작성

 

조회 예시

ANIMAL_ID NAME
A349733 Allie
A349990 Spice

 


접근법

# 구할 값 = ANIMAL_OUTS에 있는 정보 - (ANIMAL_OUTS와 ANIMAL_INS에 모두 있는 정보) = ANIMAL_OUTS에만 있는 정보

1. LEFT JOIN으로 입양 보낸 동물의 정보 (ANIMAL_OUTS) 출력

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY ANIMAL_ID;

2. 동물 보호소에 들어온 동물 정보 (ANIMAL_INS)가 없는 정보 찾기
# LEFT JOIN 대신 LEFT OUTER JOIN 사용해도 결괏값은 같음

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;

 

LEFT JOIN 실행 시 왼쪽 테이블 (위의 코드에서는 ANIMAL_OUTS 테이블) 기준으로 조회된다. 따라서 왼쪽 테이블에 있는 값과 연결되는 (ON)  오른쪽 테이블의 값이 없다면 (아래 예시에서의 Allie와 Spice, ANIMAL_OUTS에는 존재하지만 ANIMAL_INS에는 존재하지 않는 데이터) 그 행의 값은 NULL이 된다.

 

ANIMAL_ID (OUTS) NAME ANIMAL_ID (INS)
A349733 Allie  
A349990 Spice  
A349430 Gia A349430
A349890 Meo A349890

 

outer join

 

풀이법

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;

 


참고

https://hongong.hanbit.co.kr/sql-기본-문법-joininner-outer-cross-self-join/

 

SQL 기본 문법: JOIN(INNER, OUTER, CROSS, SELF JOIN)

조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.OUTER JOIN(외부

hongong.hanbit.co.kr