操作系统寒武纪 - 会让企业IT高兴吗?
543
2022-11-10
聊一聊MySQL语句的执行顺序
一、背景
今天被同事问到一个问题,order by 和 limit哪个在前。恭喜我,很尴尬的回答错了。我觉得两种都可以支持,只是返回不同的结果;但是select操作需要保证幂等性,所以注定只有一种可能;于是记录一下MySQL的语句执行顺序。
二、MySQL的执行顺序
MySQL的语句一共分为11步。
最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为下一个处理的输入。但这些虚拟表对调用者(客户端应用程序或者外部查询)不可用,只有最后一个虚拟的表才会被作为结果返回;如果没有在查询中指定某一个子句,将跳过相应的步骤。
FROM:对FROM左边的的表和右边的表计算笛卡尔积,产生虚拟表VT1.ON :对虚表VT1进行ON筛选,符合规则的表被记录在虚表VT2中。JOIN:如果指定了OUTER JOIN,那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生VT3。WHERE:对虚表3进行WHERE条件过滤。符合条件的记录才会被插入到虚拟表VT4中。GROUP BY:根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。WITH(CUBE|ROLLUP):对VT5进行cube或者rollup操作,产生表VT6。HAVING:对虚拟表VT6进行having过滤,产生虚拟表VT7。ORDER BY:对虚拟表VT7的结果集进行排序,产生虚拟表VT8。LIMIT:对虚拟表VT8做结果集截取操作。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~