[SQLD] LEFT OUTER JOIN, RIGHT OUTER JOIN 아주 쉽게 이해하기

Lena·2024년 11월 16일

데이터베이스

목록 보기
1/1
post-thumbnail

학교에서 디비 수업을 들을 때는 조인에 대해서 inner join 정도만 공부하고 넘어갔다. outer join에 대해서 그냥 이론적으로만 들었지 사실 이해를 완전히 하지는 못했는데, SQLD 시험을 준비하면서 OUTER JOIN을 제대로 이해하게 되었다.
도움을 받은 강의는 김강민님의 SQLD요약정리 이 영상 속 조인 부분이다!
(이 분 강의 정말 너무 좋다... 이론책 한번 본 후에 이 분 강의로 정리를 하면 전체적인 흐름이 정리되면서 까다로운 부분 (JOIN, 윈도우함수, 계층질의 등)에 대한 개념을 확실하게 잡고 넘어갈 수 있다)

주어진 문제는 이기적 SQL개발자 이론서 + 기출문제 책에 있는 기출문제 중 하나이다.
주어진 테이블은 다음과 같다.
(혹시 문제가 된다면 삭제하겠습니다. 알려주세요)

이 테이블을 보고 주어진 SQL 중 실행 결과가 같은 것을 찾는 문제이다.

(1)

SELECT A.ID, B.ID
FROM MytestA A FULL OUTER JOIN
MytestB B
ON A.ID = B.ID

(2)

SELECT A.ID, B.ID
FROM MytestA A LEFT OUTER JOIN
MytestB B
ON A.ID = B.ID
UNION
SELECT A.ID, B.ID
FROM MytestA A RIGHT OUTER JOIN
MytestB B
ON A.ID = B.ID

(3)

SELECT A.ID, B.ID
FROM MytestA A, MytestB B
WHERE A.ID = B.ID
UNION ALL
SELECT A.ID, NULL FROM MytestA A WHERE NOT EXISTS (SELECT 1 FROM
MytestB B WHERE AID = B.ID)
UNION ALL
SELECT NULL, B.ID FROM MytestB B
WHERE NOT EXISTS (SELECT 1 FROM
MytestA A WHERE BID = AID)

문제는 길어보이지만 푸는 방법은 정말 간단하다.
우선 테이블을 가지고 조인을 수행할 것인데, 다음과 같이 테이블을 그린다.

  1. 우선 INNER JOIN을 수행한다. 공통부분을 찾고 겹치도록 테이블을 그려준다.

    INNER JOIN 결과는 1, 3, 5, 6 이다.

  2. LEFT OUTER JOIN을 구해보자. LEFT OUTER JOIN은 말그대로, 조인에 실패한 OUTER에 있는 데이터 중 왼쪽에 있는 데이터를 포함하는 조인이다. 이렇게 말로 설명할 때는 무슨 말인가 헷갈리지만 다음과 같이 그림을 그려보면 이해가 쉽다.
    INNER JOIN을 수행한 공통부분을 포함한 것 + 왼쪽에서 조인에 실패한 데이터 + 오른쪽에 없는 값에는 NULL 을 추가해서 묶어주면 된다.

  3. RIGHT OUTER JOIN을 수행해보자. 이것은 LEFT OUTER JOIN과 완벽하게 반대이다.

  4. FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것이다.

이렇게 구해놓고 다시 SQL쿼리를 보면 문제를 심플하게 풀 수 있다.

(1) 쿼리는,

SELECT A ID, B.ID
FROM MytestA A FULL OUTER JOIN
MytestB B
ON AID = B.ID

FULL OUTER JOIN 결과이므로 → 1, 2, 3, 4, 5, 6, 7, 8

(2) 를 다시 보자.

SELECT AID, B.ID
FROM MytestA A LEFT OUTER JOIN
MytestB B
ON AID = B.ID
UNION
SELECT AID, B.ID
FROM MytestA A RIGHT OUTER JOIN
MytestB B
ON AID = B.ID

LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION 한 것이다.
중복을 제거한 후이므로 결국 FULL OUTER JOIN 결과와 동일하다.
1, 2, 3, 4, 5, 6, 7, 8

(3) SQL문은 다음과 같았다.

SELECT AID, B.ID
FROM MytestA A, MytestB B
WHERE AID = B.ID
UNION ALL
SELECT AID, NULL FROM MytestA A WHERE NOT EXISTS (SELECT 1 FROM
MytestB B WHERE AID = B.ID)
UNION ALL
SELECT NULL, B.ID FROM MytestB B
WHERE NOT EXISTS (SELECT 1 FROM
MytestA A WHERE BID = AID)

이를 해석해보면

INNER JOIN을 한 것
UNION ALL
INNER JOIN 한 테이블 B에 존재하지 않는 테이블 A에서의 A.ID
UNION ALL
INNER JOIN 한 테이블 A에 존재하지 않는 테이블 B에서의 B.ID

이다.
이는 1, 3, 5, 6 UNION ALL 7, 8 UNION ALL 2, 4 이므로
최종적으로는 1, 2, 3, 4, 5, 6, 7, 8 이 되어 모두 실행결과가 같은 보기가 정답이 된다.

profile
어제보다 성장하는 iOS 개발자입니다.

0개의 댓글