请教一个关于sql的问题

有一段sql,大家觉得会按什么结构执行,为什么?

clipboard.png

clipboard.png

这是两段结构,实际运行是按照第一段结构执行的,即order by和limit睡union的结果进行排序和分页。
为什么order by 和 limnit不是只作用于下一半的sql呢?

求解释!

阅读 4.8k
5 个回答

去掉UNION或者加括号,就只作用于下半部分。
这种情况是因为MySQL要先执行UNION然后才执行order by。

加圆括号:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
MySQL union官方文档

按第一种顺序执行是有道理的。

union不保证行的顺序。先order by再去和别的集合unionorder by就等于白做了。

你这个sql各部分的执行顺序是join>where>union>order>limit
想改变顺序就使用括号括起来

这个没什么好纠结的
mysql解析sql语句时候时认为union的优先级比order 高,所以就按照你说的第一种情况执行。

文档中也明确说明了,如果想打破默认的优先顺序,用括号把sql语句括起来就行了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题