交叉连接与笛卡尔积
有意使用 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 signLATERAL:条件交叉连接
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 反馈 — 无需本地设置。