SQL Academy · レッスン

CROSS JOINと直積

組み合わせのペアを作る目的でCROSS JOINを意図的に使い、結合キーの欠落による予期しない直積の爆発を避けます。

レッスン 1/412 ステップ

「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 sign

LATERAL:条件付き 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CROSS JOINと直積
  2. ラテラル結合(LATERAL JOIN)
  3. アンチ結合とセミ結合(NOT EXISTS)
  4. 複数テーブル結合の性能チューニング
← SQL Academyに戻る