🎉

SQLの結合、4つの違いを「合コン」で完全理解する

に公開

この記事の目的

「内部結合と外部結合の違い、説明できる?」

会議でそう聞かれて、固まった経験はないだろうか。

データ分析の話になると必ず出てくる「JOIN」という言葉。エンジニアが当然のように使っているけど、正直よくわからない。かといって今さら聞けない。そんなあなたのために、この記事を書いた。

読み終わる頃には、こう言えるようになる。

「あ、それ左外部結合ですね」

かっこいい。


対象読者

  • エンジニアではないけど、データを扱う機会が増えた総合職の方
  • SQLを「読む」必要があるけど、書く必要はない方
  • 結合の種類を何度調べても、すぐ忘れてしまう方

ゴール

  • 4種類の結合を二度と混同しない
  • 会議で結合の話が出ても、ビビらない
  • エンジニアと対等に会話できるようになる

TL;DR(忙しい人向けまとめ)

結合の種類 一言で言うと 語呂合わせ
内部結合 両方にあるやつだけ 「内気な二人」
左外部結合 左は全部、右は合うやつだけ 「左利きは譲らない」
右外部結合 右は全部、左は合うやつだけ 「右に同じ(逆)」
完全外部結合 とにかく全部出す 「完全に出しゃばり」

結合を「合コン」で理解する

いきなりだけど、合コンを想像してほしい。

左のテーブル = 男性グループ
右のテーブル = 女性グループ
結合のキー = LINE交換できた相手

この設定で、4つの結合を見ていこう。


1. 内部結合(INNER JOIN)

「内気な二人」だけが残る

男性側           女性側
┌─────────┐      ┌─────────┐
│ 田中 ─────────── 佐藤    │  ← LINE交換成功!
│ 鈴木    │      │ 高橋 ─┐ │
│ 山田 ─────────── 伊藤    │  ← LINE交換成功!
│ 佐々木  │      │ 渡辺    │
└─────────┘      └─────────┘

【内部結合の結果】
田中 ─ 佐藤
山田 ─ 伊藤

(LINE交換できたペアだけ)

内部結合は、両方のテーブルでマッチしたものだけを返す。

合コンで言えば、「LINE交換できたペア」だけがリストに残る。LINE交換できなかった鈴木くんも佐々木くんも、高橋さんも渡辺さんも、結果には出てこない。

語呂合わせ:「内気な二人」

内部結合 → 内気二人
→ 両方が「うん」と言わないと成立しない、内気なカップルをイメージ

片方だけ「いいな」と思ってもダメ。両方がマッチしないと、結果に出てこない。


2. 左外部結合(LEFT OUTER JOIN)

「左利きは譲らない」

男性側           女性側
┌─────────┐      ┌─────────┐
│ 田中 ─────────── 佐藤    │  ← マッチ!
│ 鈴木 ──── NULL  │      │ 高橋    │
│ 山田 ─────────── 伊藤    │  ← マッチ!
│ 佐々木 ── NULL  │      │ 渡辺    │
└─────────┘      └─────────┘
   ↑ 全員出る        ↑ マッチした人だけ

【左外部結合の結果】
田中 ─ 佐藤
鈴木 ─ NULL(相手なし)
山田 ─ 伊藤
佐々木 ─ NULL(相手なし)

左外部結合は、左側は全員出す。右側は、マッチした人だけ。

合コンで言えば、「男性陣は全員リストに載る。LINE交換できなかった人は『相手:なし』として記録される」という状態。

語呂合わせ:「左利きは譲らない」

左外部結合 → 利きは譲らない
→ 左側のデータは絶対に全部出す。右側がいなくても、左は譲らない。

「俺たちは全員載るからな」という男性陣の主張をイメージ。

実務での使い道

これ、実は一番よく使う結合

例えば「顧客一覧と、その顧客の注文履歴を見たい」とき。注文したことがない顧客も含めて全員見たいなら、左外部結合を使う。顧客テーブルを左に置けば、注文がない顧客も「注文:なし」として表示される。


3. 右外部結合(RIGHT OUTER JOIN)

「右に同じ(逆)」

男性側           女性側
┌─────────┐      ┌─────────┐
│ 田中 ─────────── 佐藤    │  ← マッチ!
│         │      │ 高橋 ── NULL
│ 山田 ─────────── 伊藤    │  ← マッチ!
│         │      │ 渡辺 ── NULL
└─────────┘      └─────────┘
  マッチした人だけ    ↑ 全員出る

【右外部結合の結果】
田中 ─ 佐藤
NULL ─ 高橋(相手なし)
山田 ─ 伊藤
NULL ─ 渡辺(相手なし)

右外部結合は、左外部結合の逆。右側は全員出す。左側は、マッチした人だけ。

語呂合わせ:「右に同じ(逆)」

右外部結合 → 右に同じ(逆)
→ 左外部結合と同じ考え方を、右に適用しただけ

正直、左外部結合を理解していれば、右外部結合は「逆にしただけ」で覚えられる。実務では左外部結合の方がよく使われる(テーブルの順番を入れ替えれば、右外部結合を使う必要がないから)。


4. 完全外部結合(FULL OUTER JOIN)

「完全に出しゃばり」

男性側           女性側
┌─────────┐      ┌─────────┐
│ 田中 ─────────── 佐藤    │  ← マッチ!
│ 鈴木 ──── NULL  │ 高橋 ── NULL
│ 山田 ─────────── 伊藤    │  ← マッチ!
│ 佐々木 ── NULL  │ 渡辺 ── NULL
└─────────┘      └─────────┘
   ↑ 全員出る        ↑ 全員出る

【完全外部結合の結果】
田中 ─ 佐藤
鈴木 ─ NULL
山田 ─ 伊藤
佐々木 ─ NULL
NULL ─ 高橋
NULL ─ 渡辺

完全外部結合は、両方とも全員出す。マッチしなかった人も、全員リストに載る。

合コンで言えば、「参加者全員の名簿を作る。LINE交換できた人は相手の名前付き、できなかった人は『相手なし』で記録」という状態。

語呂合わせ:「完全に出しゃばり」

完全外部結合 → 完全に出しゃばり
→ 全員が「俺も!私も!」と出しゃばって、誰一人漏れない

データの取りこぼしが許されない場面で使う。「どちらかのテーブルにしか存在しないデータも含めて、全部見たい」ときに活躍する。


図解:4つの結合を一枚で比較

        ┌───────────────────────────────────────────────────┐
        │              結合の種類と結果の範囲                │
        └───────────────────────────────────────────────────┘

【元データ】
    左テーブル        右テーブル
    ┌─────┐          ┌─────┐
    │  A  │          │  A  │  ← 共通
    │  B  │          │  C  │
    │  D  │          │  E  │
    └─────┘          └─────┘


【内部結合】INNER JOIN
「両方にあるものだけ」

        結果
      ┌─────┐
      │  A  │  ← 共通部分のみ
      └─────┘


【左外部結合】LEFT OUTER JOIN
「左は全部 + 右の共通部分」

        結果
      ┌─────┐
      │  A  │  ← 共通
      │  B  │  ← 左だけ
      │  D  │  ← 左だけ
      └─────┘


【右外部結合】RIGHT OUTER JOIN
「右は全部 + 左の共通部分」

        結果
      ┌─────┐
      │  A  │  ← 共通
      │  C  │  ← 右だけ
      │  E  │  ← 右だけ
      └─────┘


【完全外部結合】FULL OUTER JOIN
「両方全部」

        結果
      ┌─────┐
      │  A  │  ← 共通
      │  B  │  ← 左だけ
      │  D  │  ← 左だけ
      │  C  │  ← 右だけ
      │  E  │  ← 右だけ
      └─────┘

ベン図で見る4つの結合

もう一つ、集合で考えてみよう。

          【内部結合】                    【左外部結合】
     
       ┌─────┬─────┐                  ┌─────┬─────┐
      │     │█████│     │            │█████│█████│     │
      │  左 │█████│ 右  │            │█████│█████│ 右  │
      │     │█████│     │            │█████│█████│     │
       └─────┴─────┘                  └─────┴─────┘
              ↑                           ↑
          重なる部分だけ              左の全部+重なる部分


          【右外部結合】                  【完全外部結合】
     
       ┌─────┬─────┐                  ┌─────┬─────┐
      │     │█████│█████│            │█████│█████│█████│
      │  左 │█████│█████│            │█████│█████│█████│
      │     │█████│█████│            │█████│█████│█████│
       └─────┴─────┘                  └─────┴─────┘
              ↑                           ↑
        重なる部分+右の全部          両方の全部

実務でよくある場面

場面1:顧客と注文の紐付け

「顧客一覧を出したいけど、注文したことない人も含めたい」

左外部結合を使う

顧客テーブル(左)と注文テーブル(右)を結合。注文がない顧客も「注文:NULL」として表示される。

場面2:商品と在庫の確認

「在庫がある商品だけ見たい」

内部結合を使う

商品テーブルと在庫テーブルを結合。在庫がない商品は結果に出てこない。

場面3:データの突合せ

「システムAとシステムBのデータを照合したい。どちらかにしかないデータも見つけたい」

完全外部結合を使う

両方のデータを全部出して、NULLがある行を見れば「片方にしかないデータ」が分かる。


語呂合わせ総まとめ

覚えやすいように、ストーリーにしてみた。


**「内気な二人」**の田中くんと佐藤さんが、合コンでマッチした。

でも**「左利きは譲らない」**と言い張る男性陣は、マッチしなかった鈴木くんも佐々木くんも、全員名簿に載せろと主張。

女性陣も負けじと**「右に同じ(逆)」**と反論。高橋さんも渡辺さんも載せるべきだと。

結局、幹事が**「完全に出しゃばり」**精神で、全員載せた名簿を作成した。


このストーリーを思い出せば、4つの結合を混同することはなくなるはず。


まとめ

結合 英語名 何が残る? 語呂合わせ
内部結合 INNER JOIN 両方にマッチするものだけ 内気な二人
左外部結合 LEFT OUTER JOIN 左は全部+右のマッチ分 左利きは譲らない
右外部結合 RIGHT OUTER JOIN 右は全部+左のマッチ分 右に同じ(逆)
完全外部結合 FULL OUTER JOIN 両方全部 完全に出しゃばり

最後に

SQLの結合は、一度理解してしまえば難しくない。

ポイントは「どちらのテーブルを全部出したいか」を考えること。

  • 両方にあるものだけでいい → 内部結合
  • 左を全部出したい → 左外部結合
  • 右を全部出したい → 右外部結合
  • 両方全部出したい → 完全外部結合

これだけ。

次にエンジニアが「LEFT JOINで...」と言い出したら、「左外部結合ね。左のデータは全部残すやつ」と心の中でつぶやいてみてほしい。

もう、ビビる必要はない。


参考リンク


この記事が役に立ったら、フォローしていただけると励みになります。

Discussion