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 行,每个学生都配对了每一门课程。

三、交叉连接的应用场景

虽然交叉连接在日常业务查询中很少直接使用,但在某些特定场景下有其价值:

  1. 生成测试数据:快速生成大量组合数据,用于性能测试或模拟。

  2. 创建所有可能的组合:例如,为每个员工分配每个可能的角色,生成权限组合表。

  3. 多维度分析:与分组聚合结合,生成所有维度的交叉表(如所有产品与所有地区的销售预测)。

  4. 数学计算:需要两个集合的笛卡尔积的场合。

四、注意事项

  1. 结果集可能巨大:如果两个表都很大(例如各 10 万行),交叉连接会产生 100 亿行,不仅执行极慢,还可能撑爆数据库。因此,必须谨慎使用,最好加上 LIMIT 限制或确保数据量很小。

  2. 避免误用:初学者在写连接查询时容易忘记 ON 条件,导致意外产生交叉连接。务必显式使用 CROSS JOIN 或确保 JOIN 后面跟 ON 条件。

  3. 性能极差:交叉连接通常无法利用索引,因为需要生成所有组合。除非表很小,否则应避免。

五、交叉连接与其他连接的对比

连接类型

连接条件

结果行数

用途

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

练习

  1. 现有 colors 表(红、绿、蓝)和 sizes 表(S、M、L),用交叉连接生成所有颜色和尺寸的组合。

  2. 如果 colors 有 3 行,sizes 有 3 行,交叉连接的结果有多少行?

答案

1、生成所有组合

SELECT *
FROM colors
CROSS JOIN sizes;

2、9 行。

七、小结

  • 交叉连接 返回两个表的笛卡尔积,没有连接条件。

  • 语法:表1 CROSS JOIN 表2

  • 结果行数 = 左表行数 × 右表行数,可能非常巨大。

  • 主要用于生成测试数据或所有可能组合,日常查询应避免使用。

  • 务必小心误用,以免造成性能灾难。


所有评论

关于我 备案号:蜀ICP备2023042032号-1