【じょいん】

JOIN(結合) とは?

💡 複数のテーブルを「つなげて1つの表にする」SQL操作
📌 このページのポイント
SQL JOIN の種類 INNER JOIN 共通 一致する行のみ LEFT JOIN 共通 左テーブル全行+一致 RIGHT JOIN 共通 右テーブル全行+一致 users(左) id=1 田中 id=2 佐藤 id=3 鈴木 JOIN ON id orders(右) user_id=1 注文A user_id=2 注文B user_id=4 注文C INNER JOIN 結果 田中 - 注文A 佐藤 - 注文B ※ id=3,4 は不一致で除外 JOINはテーブル間の関連データを結合して1つの結果セットにする
SQL JOINによるテーブル結合の仕組みと種類
ひよこ ひよこ

JOINって何のために使うの?

ペンギン先生 ペンギン先生

データベーステーブルを分割して管理するから、必要な情報が複数のテーブルに散らばっている。例えば注文データを見るとき「注文テーブル」と「ユーザーテーブル」をJOINすることで「誰がいつ何を注文したか」を1つの結果として取得できるんだ。

ひよこ ひよこ

INNER JOINとLEFT JOINの違いがよくわからない…

ペンギン先生 ペンギン先生

INNER JOINは両方のテーブルにマッチするデータだけを返す。LEFT JOINは左のテーブルは全行残して、右にマッチするものがなければNULLで埋める。例えば「全ユーザーと、もしあれば注文データ」を取りたいならLEFT JOIN。注文がないユーザーも結果に含まれるよ。

ひよこ ひよこ

JOINってたくさん使うと遅くならない?

ペンギン先生 ペンギン先生

なる場合もある。JOINするテーブルが増えるほど組み合わせが増えて処理量が膨らむ。結合するカラムインデックスが貼ってあるかどうかで速度が大きく変わるよ。

ひよこ ひよこ

CROSS JOINとかFULL OUTER JOINとか種類が多くて混乱する…

ペンギン先生 ペンギン先生

実務で使うのはほとんどINNER JOINとLEFT JOINの2つ。CROSS JOINは全組み合わせを出す直積で、テストデータ生成くらいにしか使わない。FULL OUTER JOINは両側の全データを残す結合で、MySQLではそもそもサポートされていない。ただ厄介なのはJOINの実行順序で、複数のJOINが連なると「どのテーブルから先に結合するか」でパフォーマンスが大きく変わる。オプティマイザが最適な順序を選ぶはずなんだけど、統計情報が古いと変な実行計画になることがあるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
JOINって出てきたら「複数のテーブルを関連カラムで横につなげてまとめて取得する操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「JOIN」 = 結合する・つなげる
💬 英語の「join(加わる・結合する)」そのまま。テーブル同士を結合するイメージ
← 用語集にもどる