mysql菜鸟教程
11.6 交叉连接(CROSS JOIN)
在关系数据库中,连接查询的终极形式是交叉连接,它返回两个表的笛卡尔积(Cartesian product)。简单来说,交叉连接会将左表的每一行与右表的每一行进行组合,结果行数等于左表行数乘以右表行数。
一、什么是交叉连接?
交叉连接没有连接条件,它直接将两个表的记录全部组合在一起。如果左表有 m 行,右表有 n 行,结果集将有 m × n 行。
例如,表 A 有 3 行,表 B 有 2 行,交叉连接的结果就有 6 行,包含了所有可能的配对。
二、基本语法
标准 SQL 语法(推荐)
SELECT 列名 FROM 表1 CROSS JOIN 表2;
老式语法(不推荐)
SELECT 列名 FROM 表1, 表2;
这种写法省略了 WHERE 条件,实际上就是交叉连接。但由于容易误用,且可读性差,应避免使用。
显式 CROSS JOIN 的示例
SELECT * FROM students CROSS JOIN classes;
示例演示
假设有以下两个简单表:
students(学生表)
courses(课程表)
执行交叉连接:
SELECT s.name, c.course_name FROM students s CROSS JOIN courses c;
结果:
共 2×2=4 行,每个学生都配对了每一门课程。
三、交叉连接的应用场景
虽然交叉连接在日常业务查询中很少直接使用,但在某些特定场景下有其价值:
生成测试数据:快速生成大量组合数据,用于性能测试或模拟。
创建所有可能的组合:例如,为每个员工分配每个可能的角色,生成权限组合表。
多维度分析:与分组聚合结合,生成所有维度的交叉表(如所有产品与所有地区的销售预测)。
数学计算:需要两个集合的笛卡尔积的场合。
四、注意事项
结果集可能巨大:如果两个表都很大(例如各 10 万行),交叉连接会产生 100 亿行,不仅执行极慢,还可能撑爆数据库。因此,必须谨慎使用,最好加上 LIMIT 限制或确保数据量很小。
避免误用:初学者在写连接查询时容易忘记 ON 条件,导致意外产生交叉连接。务必显式使用 CROSS JOIN 或确保 JOIN 后面跟 ON 条件。
性能极差:交叉连接通常无法利用索引,因为需要生成所有组合。除非表很小,否则应避免。
五、交叉连接与其他连接的对比
六、实用技巧:结合 WHERE 实现条件组合
虽然交叉连接没有条件,但我们可以通过在 WHERE 中添加条件来筛选出有用的组合。例如,我们只想为学生分配他们所在年级的课程,可以:
SELECT s.name, c.course_name FROM students s CROSS JOIN courses c WHERE s.grade = c.target_grade;
这实际上等价于一个内连接,但写法不直观,不如直接使用 INNER JOIN ... ON。
练习
现有 colors 表(红、绿、蓝)和 sizes 表(S、M、L),用交叉连接生成所有颜色和尺寸的组合。
如果 colors 有 3 行,sizes 有 3 行,交叉连接的结果有多少行?
答案:
1、生成所有组合
SELECT * FROM colors CROSS JOIN sizes;
2、9 行。
七、小结
交叉连接 返回两个表的笛卡尔积,没有连接条件。
语法:表1 CROSS JOIN 表2。
结果行数 = 左表行数 × 右表行数,可能非常巨大。
主要用于生成测试数据或所有可能组合,日常查询应避免使用。
务必小心误用,以免造成性能灾难。

发表评论
所有评论