CROSS JOIN
| 対応: | SQL-92(1992) |
|---|
2つのテーブルのすべての行の組み合わせ(直積)を生成する結合です。結合条件を指定しないため、左テーブルのm行と右テーブルのn行から m×n 行の結果を返します。
構文
『CROSS JOIN』で全組み合わせを生成します。
SELECT col, ... FROM table1 CROSS JOIN table2;
カンマ区切りでも同じ結果になります(旧来の書き方)。
SELECT col, ... FROM table1, table2;
構文一覧
| 構文 | 概要 |
|---|---|
| CROSS JOIN | 2つのテーブルの全行の組み合わせ(直積)を返します。 |
| FROM t1, t2 | カンマ区切りで複数テーブルを指定すると、WHERE句なしでは CROSS JOIN と同じ結果になります。 |
サンプルコード
以下の『products』テーブルと『colors』テーブルを例に説明します。
商品テーブルとカラーテーブルのすべての組み合わせを生成します。
sample_cross_join.sql
SELECT
p.product_name,
c.color
FROM products AS p
CROSS JOIN colors AS c;
+--------------+---------+ | product_name | color | +--------------+---------+ | Tシャツ | レッド | | Tシャツ | ブルー | | Tシャツ | グリーン| | Tシャツ | ホワイト| | パーカー | レッド | | パーカー | ブルー | | パーカー | グリーン| | パーカー | ホワイト| | ジャケット | レッド | | ジャケット | ブルー | | ジャケット | グリーン| | ジャケット | ホワイト| +--------------+---------+ 12 rows in set
以下の『fighters』テーブルと『stages』テーブルを使って、対戦カード(全組み合わせ)を生成します。
ファイターとステージの全組み合わせ(3×2=6通り)を生成します。
sample_cross_join.sql
SELECT
f.name AS fighter,
s.stage_name AS stage
FROM fighters AS f
CROSS JOIN stages AS s
ORDER BY f.name, s.stage_name;
+------------------+--------------+ | fighter | stage | +------------------+--------------+ | テリー・ボガード | アテネ | | テリー・ボガード | サウスタウン | | 八神庵 | アテネ | | 八神庵 | サウスタウン | | 草薙京 | アテネ | | 草薙京 | サウスタウン | +------------------+--------------+ 6 rows in set
カレンダー生成の例です。日付の連番(nums テーブル)と月初日を CROSS JOIN して、特定の月のすべての日付を生成します。
sample_cross_join.sql
-- nums テーブルに 0〜30 の連番が入っている前提(MySQL)
SELECT DATE_ADD('2025-10-01', INTERVAL n.num DAY) AS calendar_date
FROM nums AS n
WHERE n.num <= 30
AND DATE_ADD('2025-10-01', INTERVAL n.num DAY) < '2025-11-01'
ORDER BY calendar_date;
+---------------+ | calendar_date | +---------------+ | 2025-10-01 | | 2025-10-02 | | 2025-10-03 | | ... | | 2025-10-31 | +---------------+ 31 rows in set
旧来の書き方(カンマ区切り)でも同じ結果になります。
sample_cross_join.sql
-- CROSS JOIN と同じ意味(旧来のカンマ区切り記法) SELECT f.name AS fighter, s.stage_name AS stage FROM fighters AS f, stages AS s;
+------------------+--------------+ | fighter | stage | +------------------+--------------+ | 八神庵 | アテネ | | 八神庵 | サウスタウン | | 草薙京 | アテネ | | 草薙京 | サウスタウン | | テリー・ボガード | アテネ | | テリー・ボガード | サウスタウン | +------------------+--------------+ 6 rows in set
データベース別の書き方
『CROSS JOIN』の構文は主要なデータベースで共通して使用できます。
-- MySQL・PostgreSQL・SQLite 共通 SELECT p.product_name, c.color FROM products AS p CROSS JOIN colors AS c;
Oracle では従来のカンマ区切り構文(『FROM テーブル1, テーブル2』)も広く使われています。動作は『CROSS JOIN』と同じですが、意図を明確にするために『CROSS JOIN』と明示するのが推奨されています。
概要
『CROSS JOIN』は結合条件を持たない結合で、左テーブルの各行に対して右テーブルのすべての行を組み合わせます。結果の行数は「左テーブルの行数 × 右テーブルの行数」になります。
主な用途はカレンダー生成・シフト表の枠作成・サイズとカラーの組み合わせ一覧など、意図的に全組み合わせが必要な場面です。大きなテーブル同士で使うと行数が爆発的に増えるため、件数を事前に確認してから実行してください。
結合の基本については『INNER JOIN』を、同じテーブルを自分自身と結合する方法は『SELF JOIN』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。