///

SQL JOIN Types Capsule

중복 없는 컬럼으로 join 한다고 가정: - INNER JOIN : A ∩ B (교집합만) - LEFT OUTER : A + (매칭된 B, 없으면 NULL) - RIGHT OUTER : B + (매칭된 A, 없으면 NULL) - FULL OUTER : A ∪ B (모든 행) - CROSS JOIN : A × B (카테시안)

///

kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: INNER / LEFT OUTER / RIGHT OUTER / FULL OUTER / CROSS JOIN 의미와 결과셋 — Venn diagram 기준, 예제 테이블로 행수 비교. tags: - sql - join - database - capsule


SQL JOIN Types Capsule

Summary#

중복 없는 컬럼으로 join 한다고 가정: - INNER JOIN: A ∩ B (교집합만) - LEFT OUTER: A + (매칭된 B, 없으면 NULL) - RIGHT OUTER: B + (매칭된 A, 없으면 NULL) - FULL OUTER: A ∪ B (모든 행) - CROSS JOIN: A × B (카테시안)

Claim#

예제 데이터#

A    B
-    -
1    3
2    4
3    5
4    6

(1,2) 는 A 에만, (3,4) 는 공통, (5,6) 은 B 에만.

INNER JOIN (= 교집합)#

SELECT * FROM a INNER JOIN b ON a.a = b.b;
-- 또는 (old-style, 권장 안 함)
SELECT a.*, b.* FROM a, b WHERE a.a = b.b;

a | b
--+--
3 | 3
4 | 4

두 쪽 모두에 매치되는 행만.

LEFT OUTER JOIN#

SELECT * FROM a LEFT OUTER JOIN b ON a.a = b.b;

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

A 의 모든 행 + B 에서 매치 (없으면 NULL).

RIGHT OUTER JOIN#

SELECT * FROM a RIGHT OUTER JOIN b ON a.a = b.b;

a    | b
-----+---
3    | 3
4    | 4
null | 5
null | 6

대칭 — 관례적으로 RIGHT 대신 LEFT 로 작성 (가독성).

FULL OUTER JOIN (= 합집합)#

SELECT * FROM a FULL OUTER JOIN b ON a.a = b.b;

a    |  b
-----+-----
1    | null
2    | null
3    |    3
4    |    4
null |    5
null |    6

A ∪ B. MySQL 은 직접 지원 안 함 → LEFT UNION RIGHT 또는 UNION ALL 로 흉내.

CROSS JOIN (= 카테시안 곱)#

SELECT * FROM a CROSS JOIN b;
-- 또는
SELECT * FROM a, b;

A 행수 × B 행수. 의도적 곱이 아니면 거의 항상 버그.

ANTI 패턴 (LEFT + IS NULL)#

-- A 에 있고 B 에는 없는 행
SELECT a.* FROM a
LEFT JOIN b ON a.a = b.b
WHERE b.b IS NULL;

관계형 differe. NOT EXISTS / NOT IN 대신 많이 쓰임.

Scope#

  • SQL:92 표준. PostgreSQL / MySQL / SQL Server / SQLite / Oracle 모두 지원 (FULL OUTER 는 MySQL 제외).
  • OUTER 키워드는 optional — LEFT JOIN = LEFT OUTER JOIN.

Caveats#

  • NULL 은 = 에 매치 안 됨a.x = b.x 조건에서 양쪽 다 NULL 이면 매치 아님. IS NOT DISTINCT FROM (PostgreSQL) 사용.
  • 조인 컬럼에 중복이 있으면 결과 행수가 카테시안으로 확장됨 (의도 여부 확인 필요).
  • INNER JOIN 은 join 조건을 ON 에 두는 게 표준. WHERE 로 옮기면 OUTER JOIN 에서 결과가 달라짐 (left-table 조건 → ON, right-table 필터 → WHERE 후치).
  • 성능: INNER 는 optimizer 가 재배치 자유. OUTER 는 순서 보존 요구 → 인덱스 주의.

Source#

Sagwan Revalidation 2026-04-19T00:40:36Z#

  • verdict: ok
  • note: SQL JOIN 의미론/예제/MySQL FULL OUTER 우회법 모두 현재 practice와 일치하며 오탈자·모순 없음.