a 表:
https://imgur.com/B7ssei4
b 表:
https://imgur.com/B7ssei4
查询语句:
SELECT a.id AS aid ,a.`name`,b.`id` AS bid ,b.`name` FROM a LEFT JOIN b ON a.`bid`=b.`id`;
结果:
https://imgur.com/0QnBSoR
问题:
left join 不应该是以左表为基准跟右表进行笛卡尔积吗,怎么发现结果集的顺序是反过来的。a 表 left join b 表居然会按 b 表的顺序排序出结果
https://imgur.com/B7ssei4
b 表:
https://imgur.com/B7ssei4
查询语句:
SELECT a.id AS aid ,a.`name`,b.`id` AS bid ,b.`name` FROM a LEFT JOIN b ON a.`bid`=b.`id`;
结果:
https://imgur.com/0QnBSoR
问题:
left join 不应该是以左表为基准跟右表进行笛卡尔积吗,怎么发现结果集的顺序是反过来的。a 表 left join b 表居然会按 b 表的顺序排序出结果
10 条回复 • 2021-12-09 13:08:50 +08:00
|
1
F281M6Dh8DXpD1g2 2021 年 12 月 8 日 via iPhone
sql 的结果集是无序的,除非你用 order by
|
|
2
djs19920210 OP |
|
3
djs19920210 OP b 表 |
|
4
djs19920210 OP 查询结果 |
|
5
zakokun 2021 年 12 月 8 日
你 ab 表的图片是一样的;
具体结果这个你可以 explain 一下,看看用到的索引。因为你的 bid 是 b 表的主键 id ,所以有可能是用 b 的主键索引,因此顺序是按照 b 表的 |
|
6
Ariver 2021 年 12 月 8 日 via iPhone
没有 order by 的时候的顺序是不稳定的。不要依赖这个写逻辑。
|
|
7
djs19920210 OP |
|
8
Cihua 2021 年 12 月 9 日
STRAIGHT_JOIN ?
|
|
9
orzwalker111 2021 年 12 月 9 日 via iPhone
1 left 不能决定会用左表作为驱动表,驱动表是小表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表
2 如果有 left 语义,应该将被驱动表字段放在 on ,不要放在 where |
|
10
orzwalker111 2021 年 12 月 9 日 via iPhone
sql 中涉及查询时 a 三个字段,b 两个,b 小表,作为驱动表
|
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
b 表
查询结果