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(学生表)
student_id
name
1
张三
2
李四
courses(课程表)
course_id
course_name
101
数学
102
英语
执行交叉连接:
SELECT s.name, c.course_name
FROM students s
CROSS JOIN courses c;
结果:
name
course_name
张三
数学
张三
英语
李四
数学
李四
英语
共 2×2=4 行,每个学生都配对了每一门课程。
三、交叉连接的应用场景
虽然交叉连接在日常业务查询中很少直接使用,但在某些特定场景下有其价值:
-
生成测试数据:快速生成大量组合数据,用于性能测试或模拟。
-
创建所有可能的组合:例如,为每个员工分配每个可能的角色,生成权限组合表。
-
多维度分析:与分组聚合结合,生成所有维度的交叉表(如所有产品与所有地区的销售预测)。
-
数学计算:需要两个集合的笛卡尔积的场合。
四、注意事项
-
结果集可能巨大:如果两个表都很大(例如各 10 万行),交叉连接会产生 100 亿行,不仅执行极慢,还可能撑爆数据库。因此,必须谨慎使用,最好加上 LIMIT 限制或确保数据量很小。
-
避免误用:初学者在写连接查询时容易忘记 ON 条件,导致意外产生交叉连接。务必显式使用 CROSS JOIN 或确保 JOIN 后面跟 ON 条件。
-
性能极差:交叉连接通常无法利用索引,因为需要生成所有组合。除非表很小,否则应避免。
五、交叉连接与其他连接的对比
连接类型
连接条件
结果行数
用途
INNER JOIN
有
匹配行数
查找相关数据
LEFT JOIN
有
左表行数
保留左表全部
RIGHT JOIN
有
右表行数
保留右表全部
FULL JOIN
有
两表并集
完整展示双方
CROSS JOIN
无
行数乘积
生成笛卡尔积
六、实用技巧:结合 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。
-
结果行数 = 左表行数 × 右表行数,可能非常巨大。
-
主要用于生成测试数据或所有可能组合,日常查询应避免使用。
-
务必小心误用,以免造成性能灾难。

发表评论
所有评论