0Pricing
SQL Academy · 课时

交叉连接与笛卡尔积

有意使用 CROSS JOIN 生成组合配对,并避免因缺少连接键而意外产生笛卡尔积爆炸。

交叉连接与笛卡尔积 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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:条件交叉连接

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)

CROSS JOIN 与 VALUES

内联一个小型集合:

SELECT u.email, c.code
FROM users u
CROSS JOIN (VALUES ('EUR'), ('USD'), ('GBP')) AS c(code);

避免使用逗号连接语法

隐式逗号连接(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 Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「交叉连接与笛卡尔积」这节课中我会学到什么?

有意使用 CROSS JOIN 生成组合配对,并避免因缺少连接键而意外产生笛卡尔积爆炸。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「交叉连接与笛卡尔积」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 交叉连接与笛卡尔积
  2. 横向连接(LATERAL JOIN)
  3. 反连接与半连接(NOT EXISTS)
  4. 多表连接性能调优
← 返回 SQL Academy