SQL複数JOIN -- 3つ以上のテーブルの連鎖結合

複数のSQL JOINを連鎖させて3つ以上のテーブルからデータをクエリする方法を学びます。実行順序、結合タイプの混在、よくある間違いの回避をカバーします。

Practical Examples

詳細な説明

2つ以上のテーブルの結合

実際のクエリでは3つ、4つ、またはそれ以上のテーブルを結合することが日常的です。追加のJOIN句ごとに、それまでに構築された結果セットに新しいテーブルをリンクします。

構文 -- 3テーブル結合

SELECT
  o.id AS order_id,
  c.name AS customer,
  p.name AS product,
  oi.quantity
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.id
INNER JOIN order_items AS oi ON o.id = oi.order_id
INNER JOIN products AS p ON oi.product_id = p.id;

実行順序

概念的に、データベースは結合を左から右に処理します:

  1. orders JOIN customers -- 結合結果を生成。
  2. その結果 JOIN order_items -- 商品の詳細を追加。
  3. その結果 JOIN products -- 商品名を追加。

実際にはクエリオプティマイザが効率化のために結合順序を並べ替えることがありますが、論理的な結果は物理的な実行順序に関わらず同じです。

JOINタイプの混在

1つのクエリでINNER、LEFT、RIGHT JOINを混在させることができます:

SELECT c.name, o.id, r.return_date
FROM customers AS c
LEFT JOIN orders AS o ON c.id = o.customer_id
LEFT JOIN returns AS r ON o.id = r.order_id;

注意:LEFT JOINの後にINNER JOINを使用すると、NULL行がフィルタリングされてLEFT JOINの効果が「取り消される」可能性があります。後続の各結合がINNERかLEFTかを常に考慮してください。

可読性のヒント

  • 各JOINを独自の行にインデントする。
  • すべてのテーブルに短く意味のある名前でエイリアスを付ける。
  • 複雑な結合条件にコメントを付ける。
  • FROMテーブルを「主」エンティティとし、「補助」テーブルをそれに結合する。

多数の結合によるパフォーマンス

各結合はクエリの複雑さを増加させます。すべての結合カラムにインデックスがあることを確認し、EXPLAIN ANALYZEを使用してクエリプランを検証してください。6-8テーブル以上を結合するクエリの場合、明確さと場合によってはパフォーマンスのために、CTEまたはサブクエリに分割することを検討してください。

ユースケース

複数の正規化テーブルに散在するデータが必要な場合に複数の結合を使用します。例えば、顧客の詳細、商品名、配送先住所、支払い状況をすべて1つのクエリで取得する注文レポートです。

試してみる — SQL JOIN Visualizer

フルツールを開く