기억보다 기록을

[Programmers] 없어진 기록 찾기 LEFT OUTER JOIN 본문

Language/SQL

[Programmers] 없어진 기록 찾기 LEFT OUTER JOIN

juyeong 2022. 2. 1. 17:56
반응형

안녕하세요. 프로그래머스의 "없어진 기록찾기" 문제입니다. 이 문제를 풀기 위해서 left outer join(left join)에 대한 이해가 필요합니다.

left outer join은 위 벤다이어그램의 A부분에 해당하는 데이터를 추출하는 sql 입니다.
두 개의 테이블을 예시로 들겠습니다.

book

id book_name publish_date authour_id
1 happy lunar new year 20220201 1
2 I ate ddeok-guk 20220205 2
3 this morning 20210212 1
4 how about you 20110523 null


author

aid name nation city sex
1 jerry uk London female
2 danny uk Bristol male
3 herby denmark Aalborg male
4 rouise france Paris female

 

SELECT * FROM book LEFT OUTER JOIN author 
ON book.authour_id=author.aid

left outer join을 기준으로 왼쪽테이블이 A, 오른쪽테이블이 B가 됩니다.
"A 테이블 옆에 B를 붙일건데 on 조건에 맞는 데이터로 가져오자"라고 해석하시면 됩니다.

추출 결과는 다음과 같습니다.

id book_name publish_date authour_id aid name nation city sex
1 happy lunar new year 20220201 1 1 jerry uk London female
2 I ate ddeok-guk 20220205 2 2 danny uk Bristol male
3 this morning 20210212 1 1 jerry uk London female
4 how about you 20110523 null null null null null null


이 때 id값이 null인 행이 없으므로 빈칸은 null로 채워집니다.

"왼쪽 테이블엔 값이 있는데 오른쪽 테이블의 해당 행에는 값이 없음"라고 해석하시면 됩니다.

left outer join에 대한 이해가 생겼으면 문제를 풀이하기 쉽습니다.
입양을 간 기록(ANIMAL_OUTS)이 있고 보호소에 들어온 기록은 없습니다.
1) SQL을 실행하여 데이터가 나와야하므로 ANIMAL_OUTS테이블이 왼쪽에 위치해야 합니다.
2) 두 테이블을 연결했을 때, OUTS엔 있지만 INS엔 없는 데이터값은 NULL값으로 채워질 것입니다.
3) NULL로 연결된 행을 통해 OUTS엔 있지만 INS엔 없는 데이터의 값을 불러올 수 있습니다.

제가 제출한 정답은 다음과 같습니다.보통 as로 별명을 적어주는데 저는 그냥 쭉 쓰는게 편하더라고요.

그래도 다음부턴 별명을 써줘야겠습니다.🧐

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


실행결과


덧붙여, LEFT OUTER JOIN과 LEFT JOIN은 같은 기능을 합니다.
RIGHT OUTER JOIN은 위의 내용과 같으나 좌우의 위치를 바꿔주면 됩니다.

문제링크: https://programmers.co.kr/learn/courses/30/lessons/59042

반응형