414. 외부 조인 (Outer Join)
⚠️ 이 문서는 일반적인 조인(Inner Join)을 했을 때 조건에 맞는 짝꿍이 없어서 결과에서 아예 통째로 사라져버리는(소실되는) 데이터를 살려내기 위해, **짝꿍이 없더라도 억지로 빈칸(Null)을 채워서라도 기준이 되는 테이블의 데이터를 무조건 살려내는 '외부 조인'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 내부 조인(Inner Join)은 교집합만 보여주지만, 외부 조인(Outer Join)은 교집합뿐만 아니라 기준이 되는 테이블의 **'나머지 모든 데이터(합집합의 일부)'**까지 싹 다 보여주는 연산이다.
- 가치: "우리 반 학생 중에서 도서관에서 책을 빌린 학생과 그 책 이름을 보여줘"가 아니라, **"책을 안 빌린 학생 이름까지 전부 다 보여줘(책 이름은 Null로 처리)"**라고 할 때 쓰인다.
- 기술 체계: 어느 쪽 테이블을 기준으로 삼아서 살려낼 것인가에 따라 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줄 비유 설명
- 체육대회에서 '파란 팀'과 '빨간 팀'이 짝짓기 게임을 했어요.
- 이너 조인(Inner Join)은 짝꿍을 찾은 친구들만 춤을 추고, 짝을 못 찾은 친구들은 집에 가야 해요.
- 아우터 조인(Outer Join)은 집에 가는 친구들을 붙잡아서, 짝꿍 자리에 '투명 인간(Null)'을 세워주고 다 같이 춤을 추게 해주는 아주 착한 게임이랍니다!