SQL CROSS JOIN -- すべての行の組み合わせを生成

SQL CROSS JOINが2つのテーブルのデカルト積を生成する仕組みを学びます。構文、使用すべき場面、意図しないCROSS JOINの回避方法を理解します。

JOIN Types

詳細な説明

CROSS JOINとは?

CROSS JOINは2つのテーブルのデカルト積を生成します。左テーブルのすべての行が右テーブルのすべての行とペアになります。Table Aにm行、Table Bにn行ある場合、結果はm * n行になります。結合条件(ON句)は使用しません。

構文

-- 明示的なCROSS JOIN
SELECT s.size_name, c.color_name
FROM sizes AS s
CROSS JOIN colors AS c;

-- 暗黙的(カンマ)構文 -- 同等だが可読性が低い
SELECT s.size_name, c.color_name
FROM sizes s, colors c;

ベン図の解釈

ベン図はCROSS JOINの完全な比喩ではありません。マッチ条件がないためです。両方のテーブルのすべてのデータが参加することを示すために両方の円が完全にハイライトされますが、重なる領域に特別な意味はありません。

結果サイズの警告

CROSS JOINは乗法的に増加します。1,000行のテーブルを別の1,000行のテーブルとクロスすると1,000,000行が生成されます。本番環境でCROSS JOINを実行する前に、必ずテーブルサイズを確認してください:

SELECT
  (SELECT COUNT(*) FROM sizes) *
  (SELECT COUNT(*) FROM colors) AS expected_rows;

実用的な用途

  1. 組み合わせ生成:商品カタログのすべてのサイズ/カラーの組み合わせを作成。
  2. カレンダーグリッド:月と曜日をクロスしてスケジューリングマトリックスを構築。
  3. テストデータ:2つの小さなシードテーブルから大きな結果セットを生成。
  4. レポート:ピボットテーブルのスケルトンとしてすべての販売地域とすべての製品をペア。

意図しないCROSS JOIN

INNER JOINでON句を忘れたり、カンマ構文でWHERE句なしで使用すると、意図しないCROSS JOINが発生します。これは最も一般的なSQLのミスの1つであり、テーブルが大きい場合はデータベースを停止させる可能性があります。

-- バグ:ON句がないためCROSS JOINになる
SELECT * FROM orders JOIN customers;

CROSS JOIN以外の結合では、常に明示的なON条件を含めてください。

ユースケース

商品のすべてのサイズとカラーの組み合わせの生成やタイムスロットのカレンダーグリッドの構築など、2つのテーブルの行のすべての組み合わせが本当に必要な場合にCROSS JOINを使用します。

試してみる — SQL JOIN Visualizer

フルツールを開く