テーブルを"横につなぐ"JOIN:複数テーブルを組み合わせてデータを取り出す
正規化が正しく設計されたデータベースでは、顧客情報・注文情報・商品情報はそれぞれ別のテーブルに保存されています。「どの顧客が、何を、いくつ注文したか」を一覧で見るには、これらのテーブルを横につなぐ操作が必要です。それが JOIN(結合) です。
JOINの基本構造
JOINは、二つのテーブルが共通して持つ列(多くの場合はID)を照合し、一致したレコードを横に並べます。
SELECT
orders.id,
customers.name,
orders.amount
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id;
orders テーブルの customer_id と、customers テーブルの id が一致する行同士を結合しています。この「どの列で照合するか」の指定が ON 句です。
INNER JOIN:両方に存在するものだけを取り出す
最も基本的な結合。両テーブルで一致する行のみが結果に含まれます。
片方のテーブルにしか存在しないレコードは結果から除外されます。例えば、注文を一度もしていない顧客は、INNER JOINでは表示されません。
主な用途:注文一覧を顧客名・商品名付きで取り出す、ログと操作者情報を紐づけるなど。
LEFT JOIN:左テーブルを起点に、右を補完する
FROM の直後に書いたテーブル(左テーブル)のレコードはすべて表示し、右テーブルに一致するものがあれば補完します。一致しない場合は右側の列がNULLになります。
SELECT
customers.name,
orders.amount
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;
注文のない顧客も一覧に含まれ、amount はNULLで表示されます。
主な用途:「まだ注文していない顧客を抽出する」「紐付けデータがあれば補足する」など、漏れを出したくない場面で多用します。
RIGHT JOIN:右テーブルを起点にする
LEFT JOINの逆。右テーブルのレコードをすべて保持し、左テーブルに一致するものがあれば補完します。
実務では RIGHT JOIN の出番は少なく、テーブルの順序を入れ替えて LEFT JOIN で書き直せることがほとんどです。読みやすさの観点から、LEFT JOINに統一しているプロジェクトも多くあります。
OUTER JOIN(外部結合)について
「OUTER JOIN」は LEFT JOIN・RIGHT JOIN・FULL OUTER JOIN をまとめて指す概念的な呼称です。日常のSQL操作では LEFT JOIN と書くのが一般的で、LEFT OUTER JOIN と書いても同じ意味です。
FULL OUTER JOIN は、両テーブルのすべてのレコードを残し、一致しないものはどちら側もNULLで表示します。データ照合・突き合わせ処理(例:旧システムと新システムのデータ差分確認)で使いますが、業務システムの通常クエリではほとんど登場しません。
JOINを使いすぎると起きること
JOINを重ねるほど結果行数が膨れることがあります。特に「1対多」の関係を複数回JOINすると、意図せず行が重複して集計結果がずれる(行の爆発)ことがあります。JOINの結果にCOUNTやSUMをかけるときは、件数が想定通りかを必ず確認してください。
また、JOINする列にインデックスが設定されていないと、テーブルが大きくなったときにクエリが著しく遅くなります。設計レビューで「結合キーにインデックスがあるか」は必ず確認すべきポイントです。
まとめ
| 種類 | 動作 | 主な用途 |
|---|---|---|
| INNER JOIN | 両方に一致するものだけ | 紐付けが確実なデータの取得 |
| LEFT JOIN | 左テーブルは全件、右を補完 | 漏れを許容して全件取得したいとき |
| RIGHT JOIN | 右テーブルは全件、左を補完 | LEFT JOINで代替できるため出番は少ない |
| FULL OUTER JOIN | 両テーブル全件、一致しない部分はNULL | データ突き合わせ・差分確認 |
JOINは正規化の恩恵を受けるための操作です。「なぜテーブルが分かれているのか」が理解できると、JOINの使い方も自然に身につきます。