414. 외부 조인 (Outer Join)

⚠️ 이 문서는 일반적인 조인(Inner Join)을 했을 때 조건에 맞는 짝꿍이 없어서 결과에서 아예 통째로 사라져버리는(소실되는) 데이터를 살려내기 위해, **짝꿍이 없더라도 억지로 빈칸(Null)을 채워서라도 기준이 되는 테이블의 데이터를 무조건 살려내는 '외부 조인'**을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 내부 조인(Inner Join)은 교집합만 보여주지만, 외부 조인(Outer Join)은 교집합뿐만 아니라 기준이 되는 테이블의 **'나머지 모든 데이터(합집합의 일부)'**까지 싹 다 보여주는 연산이다.
  2. 가치: "우리 반 학생 중에서 도서관에서 책을 빌린 학생과 그 책 이름을 보여줘"가 아니라, **"책을 안 빌린 학생 이름까지 전부 다 보여줘(책 이름은 Null로 처리)"**라고 할 때 쓰인다.
  3. 기술 체계: 어느 쪽 테이블을 기준으로 삼아서 살려낼 것인가에 따라 Left Outer Join, Right Outer Join, Full Outer Join 3가지로 나뉜다.

Ⅰ. 개요: 짝 잃은 기러기 구출 작전 (Context & Necessity)

학생(학번, 이름) 테이블과 수강(학번, 과목) 테이블이 있다.

  • 철수는 수학을 듣고 있다.
  • 영희는 아무 과목도 듣고 있지 않다.

일반적인 **내부 조인(Inner Join)**을 돌려보자. SELECT * FROM 학생 INNER JOIN 수강 ON 학생.학번 = 수강.학번;

  • 결과: [철수, 수학] 1줄만 나온다.
  • 문제점: 영희는 수강 테이블에 짝꿍(학번)이 없기 때문에 결과에서 아예 흔적도 없이 사라져버렸다. (데이터 손실)

선생님이 "수강 신청 안 한 애들까지 포함해서 전체 학생 명단을 뽑아와!"라고 지시했다면? 이때 쓰는 것이 **외부 조인(Outer Join)**이다.

📢 섹션 요약 비유: 내부 조인은 **'커플만 파티장에 입장시키는 깐깐한 경호원'**입니다. 솔로(영희)는 쫓겨나죠. 외부 조인은 **'솔로도 입장시켜주는 착한 파티'**입니다. 대신 솔로의 옆자리(과목 칸)는 투명 인간(Null)으로 채워서 빈자리를 표시해 줍니다.


Ⅱ. 외부 조인의 3가지 종류 ★

어떤 테이블을 살려낼지(기준으로 삼을지) 방향에 따라 나뉜다. (기준 테이블: 학생 LEFT JOIN 수강)

1. LEFT Outer Join (왼쪽 살리기)

  • 기준: JOIN 글자를 기준으로 왼쪽에 적힌 테이블(학생)의 모든 데이터를 무조건 살린다.
  • 결과: [철수, 수학], [영희, Null]
  • 활용: 실무에서 가장 압도적으로 많이 쓰이는 조인 방식이다.

2. RIGHT Outer Join (오른쪽 살리기)

  • 기준: JOIN 글자를 기준으로 오른쪽에 적힌 테이블(수강)의 모든 데이터를 무조건 살린다.
  • 활용: 잘 안 쓴다. 왜냐하면 그냥 두 테이블의 자리를 바꾸고 LEFT JOIN을 쓰는 게 인간의 뇌 구조상 더 직관적이기 때문이다.

3. FULL Outer Join (양쪽 다 살리기)

  • 기준: 왼쪽, 오른쪽 상관없이 짝꿍이 없는 솔로들을 모두 살려낸다.
  • 결과: [철수, 수학], [영희, Null], [Null, 유령과목]
  • 활용: 두 테이블의 데이터를 한 톨도 버리지 않고 합칠 때 쓴다. (MySQL은 Full Outer Join을 지원하지 않아서, Left와 Right를 UNION으로 합쳐서 꼼수로 구현해야 한다.)

Ⅲ. 실무 꿀팁: 안 빌린 사람 찾기 (Anti Join)

외부 조인은 "짝꿍이 없는 애들만 골라내기"에 최적화된 마법의 도구다.

목표: 수강 신청을 안 한 학생(영희)만 찾아라!

SELECT 학생.이름 
FROM 학생 
LEFT OUTER JOIN 수강 ON 학생.학번 = 수강.학번
WHERE 수강.학번 IS NULL;   -- ★ 핵심: 짝꿍이 없어서 억지로 채워진 빈칸(Null)만 찾아라!
┌──────────────────────────────────────────────────────────────┐
│           조인(Join)의 종류와 데이터 포함 관계 (벤 다이어그램) 시각화       │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ 🟢 INNER JOIN (교집합) ]                                     │
│     ( A ∩ B )   ◀── 짝꿍이 있는 데이터만 살아남음.                    │
│                                                              │
│ [ 🔵 LEFT OUTER JOIN ]                                       │
│     ( A 전체 ) + ( A ∩ B )  ◀── 왼쪽(A)은 무조건 다 살아남음.       │
│                                                              │
│ [ 🟣 FULL OUTER JOIN (합집합) ]                                │
│     ( A ∪ B )   ◀── 양쪽의 솔로와 커플이 모두 살아남음.                │
│                                                              │
│ ★ 특징: Outer Join에서 짝이 없는 쪽의 빈칸은 무조건 NULL로 채워진다.       │
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"버려지는 데이터 속에 진짜 비즈니스 인사이트가 숨어있다." 데이터 분석가들이 가장 많이 던지는 쿼리는 "A를 산 사람"보다 "A를 장바구니에 담아놓고 안 산 사람(이탈자)"을 찾는 쿼리다. 내부 조인(Inner Join)은 완벽한 교집합만 보여주기 때문에 이탈자를 찾아낼 수 없다. 외부 조인(Outer Join)은 단순히 데이터를 합치는 기술을 넘어, '없는 데이터(Null)'를 명시적으로 드러내어 비즈니스의 구멍을 찾아내게 해주는 가장 강력한 분석 도구다.


📌 관련 개념 맵

  • 관련 연산자: 관계 대수 ($\bowtie$ 기호에 꼬리를 단 모양 사용), Inner Join
  • 활용 기법: Anti Join (안 한 사람 찾기 - IS NULL 필터링)
  • SQL 벤더 특징: Oracle은 구형 문법으로 (+) 기호를 써서 Outer Join을 표현하기도 한다. (예: A.id = B.id(+) $\rightarrow$ A가 기준인 Left Outer Join)

👶 어린이를 위한 3줄 비유 설명

  1. 체육대회에서 '파란 팀'과 '빨간 팀'이 짝짓기 게임을 했어요.
  2. 이너 조인(Inner Join)은 짝꿍을 찾은 친구들만 춤을 추고, 짝을 못 찾은 친구들은 집에 가야 해요.
  3. 아우터 조인(Outer Join)은 집에 가는 친구들을 붙잡아서, 짝꿍 자리에 '투명 인간(Null)'을 세워주고 다 같이 춤을 추게 해주는 아주 착한 게임이랍니다!