CROSS JOINと直積
組み合わせのペアを作る目的でCROSS JOINを意図的に使い、結合キーの欠落による予期しない直積の爆発を避けます。
「CROSS JOINと直積」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
CROSS JOIN とは
CROSS JOIN は、行のあらゆる組み合わせを生成します。出力される行数は m × n です。ON 句はありません。
SELECT * FROM a CROSS JOIN b;
-- Equivalent:
SELECT * FROM a, b; -- comma join, no condition意図しない直積
典型的なバグは、JOIN 条件を忘れて、A のすべての行と B のすべての行を組み合わせてしまうことです。
SELECT u.email, o.id
FROM users u, orders o; -- missing WHERE u.id = o.user_id !
-- m users × n orders rows — millions!意図的な使用例
すべての組み合わせが必要な場合、CROSS JOIN は便利です。
- 空のバケットも含むレポートのための、カテゴリ × 期間の組み合わせ
- テストデータ:すべてのユーザー × すべての商品
- カレンダー:すべての店舗 × すべての日付
カレンダー × 店舗の例
すべての店舗について、売上がゼロの日も埋めます。
SELECT d.day, s.id, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, '1 day') AS d(day)
CROSS JOIN stores s
LEFT JOIN orders o ON o.store_id = s.id
AND date_trunc('day', o.created_at) = d.day
GROUP BY d.day, s.id
ORDER BY d.day, s.id;直積と EXPLAIN
意図しない直積は、EXPLAIN ANALYZE で行数が非常に多く表示されることで分かります。
EXPLAIN ANALYZE
SELECT u.email, o.id FROM users u, orders o;
-- Nested Loop (rows=10000000) ← warning signLATERAL:条件付き CROSS JOIN
LATERAL JOIN は、右側が左側を参照できる CROSS JOIN のようなものです。詳しくは次のレッスンで扱います。
順列と組み合わせ
重複のないペア(A,B)を作るには、ON 句に比較条件を追加します。
SELECT a.id, b.id
FROM products a
JOIN products b ON a.id < b.id;
-- All unique pairs of products, no (A,A), no (B,A) duplicates of (A,B)VALUES との CROSS JOIN
小さな集合をインラインで定義します。
SELECT u.email, c.code
FROM users u
CROSS JOIN (VALUES ('EUR'), ('USD'), ('GBP')) AS c(code);カンマによる JOIN 構文を避ける
暗黙的なカンマ JOIN(FROM a, b)は合法ですが、意図が分かりにくくなります。明示的な CROSS JOIN を優先してください。
-- Don't (looks like a typo):
FROM users, orders
-- Do:
FROM users CROSS JOIN ordersパフォーマンス
CROSS JOIN 自体は低コストです。評価する条件がないためです。コストを左右するのは出力行数で、10k × 10k は 1億行になります。
まとめ
CROSS JOIN = すべてのペアです。
- 組み合わせを意図的に作る場合に使用する
- 意図しない直積(WHERE の欠落)に注意する
- generate_series と組み合わせて、欠損を埋めるレポートを作成する
クイックチェック
SELECT * FROM users u, orders o; を WHERE なしで記述しました。出力はどうなりますか?
AI チューターと学ぶ SQL — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 46
- レッスン
- 183
よくある質問
「CROSS JOINと直積」レッスンは無料ですか?
はい。「CROSS JOINと直積」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「CROSS JOINと直積」で何を学びますか?
組み合わせのペアを作る目的でCROSS JOINを意図的に使い、結合キーの欠落による予期しない直積の爆発を避けます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「CROSS JOINと直積」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。