djs19920210
V2EX  ›  程序员

关于 left join 后结果集顺序问题

By djs19920210 at 2021 年 12 月 8 日 · 2978 次点击
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 表的顺序排序出结果
10 条回复  •  2021-12-09 13:08:50 +08:00
F281M6Dh8DXpD1g2
   1
F281M6Dh8DXpD1g2  
   2021 年 12 月 8 日 via iPhone
sql 的结果集是无序的,除非你用 order by
djs19920210
   2
djs19920210  
OP
   2021 年 12 月 8 日
djs19920210
   3
djs19920210  
OP
   2021 年 12 月 8 日
b 表
djs19920210
   4
djs19920210  
OP
   2021 年 12 月 8 日
查询结果
zakokun
   5
zakokun  
   2021 年 12 月 8 日
你 ab 表的图片是一样的;
具体结果这个你可以 explain 一下,看看用到的索引。因为你的 bid 是 b 表的主键 id ,所以有可能是用 b 的主键索引,因此顺序是按照 b 表的
Ariver
   6
Ariver  
   2021 年 12 月 8 日 via iPhone
没有 order by 的时候的顺序是不稳定的。不要依赖这个写逻辑。
Cihua
   8
Cihua  
   2021 年 12 月 9 日
STRAIGHT_JOIN ?
orzwalker111
   9
orzwalker111  
   2021 年 12 月 9 日 via iPhone
1 left 不能决定会用左表作为驱动表,驱动表是小表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表
2 如果有 left 语义,应该将被驱动表字段放在 on ,不要放在 where
orzwalker111
   10
orzwalker111  
   2021 年 12 月 9 日 via iPhone
sql 中涉及查询时 a 三个字段,b 两个,b 小表,作为驱动表
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 41ms · 3.9.8.5