言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. CROSS JOIN

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 JOIN2つのテーブルの全行の組み合わせ(直積)を返します。
FROM t1, t2カンマ区切りで複数テーブルを指定すると、WHERE句なしでは CROSS JOIN と同じ結果になります。

サンプルコード

以下の『products』テーブルと『colors』テーブルを例に説明します。

products product_name Tシャツ パーカー ジャケット 3 rows in set

colors color レッド ブルー グリーン ホワイト 4 rows in set

商品テーブルとカラーテーブルのすべての組み合わせを生成します。

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

以下の『members』テーブルと『locations』テーブルを使って、全組み合わせを生成します。

members name user_a user_c user_e 3 rows in set

locations location_name zone_a org_a 2 rows in set

ユーザーと拠点の全組み合わせ(3×2=6通り)を生成します。

sample_cross_join.sql
SELECT
    f.name AS member,
    s.location_name AS location
FROM members AS f
CROSS JOIN locations AS s
ORDER BY f.name, s.location_name;
+--------+----------+
| member | location |
+--------+----------+
| user_a | org_a    |
| user_a | zone_a   |
| user_c | org_a    |
| user_c | zone_a   |
| user_e | org_a    |
| user_e | zone_a   |
+--------+----------+
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 member, s.location_name AS location
FROM members AS f, locations AS s;
+--------+----------+
| member | location |
+--------+----------+
| user_a | zone_a   |
| user_a | org_a    |
| user_c | zone_a   |
| user_c | org_a    |
| user_e | zone_a   |
| user_e | org_a    |
+--------+----------+
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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。