MySQL 联合查询执行原理:多表笛卡尔积
在 MySQL 执行多表联合查询时,如果没有指定连接条件(如 JOIN...ON 或 WHERE),系统会执行最基础的笛卡尔积运算。
1. 基础数据准备
学生表 (Table A)
| id (编号) | name (姓名) | gender (性别) |
|---|---|---|
| 1 | 张三 | 男 |
| 2 | 李四 | 女 |
| 3 | 王五 | 男 |
| 4 | 赵六 | 男 |
班级表 (Table B)
| id (编号) | name (班级) |
|---|---|
| 1 | 1班 |
| 2 | 2班 |
2. 笛卡尔积的执行过程
对多张表进行笛卡尔积时,MySQL 会遵循以下逻辑进行组合:
- 取第一条记录:先从第一张表(学生表)中取出第一条记录(张三)。
- 全量组合 :将这条记录分别与第二张表(班级表)中的每一条记录进行组合,生成新的记录。
张三+1班生成第1条结果张三+2班生成第2条结果
- 循环往复:接着取出学生表的第二条记录(李四),再次与班级表的所有记录组合。
- 最终结果 :直到遍历完第一张表的所有行,得到一个全排列结果集。
3. 联合查询结果集 (全排列)
最终生成的查询结果如下表所示:
| id | 姓名 | 性别 | 班级.id | 班级名 |
|---|---|---|---|---|
| 1 | 张三 | 男 | 1 | 1班 |
| 1 | 张三 | 男 | 2 | 2班 |
| 2 | 李四 | 女 | 1 | 1班 |
| 2 | 李四 | 女 | 2 | 2班 |
| 3 | 王五 | 男 | 1 | 1班 |
| 3 | 王五 | 男 | 2 | 2班 |
| 4 | 赵六 | 男 | 1 | 1班 |
| 4 | 赵六 | 男 | 2 | 2班 |