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