常见SQL语句执行顺序解析

  • Post author:
  • Post category:其他


以最一般的写法为例:

SELECT DISTINCT
	< SOME_FIELDS >
FROM
	< TABLE1 >
JOIN < TABLE2 > ON < ON_CONDITION >
WHERE
	< WHERE_CONDITION >
GROUP BY
	< SOME_EXISTS_FIELDS >
HAVING
	< SOME_NOTEXISTS_FIELDS >
ORDER BY
	< SOME_EXISTS_FIELDS >
LIMIT [ OFFSET ,...]

执行顺序分析:

  1. FROM: 指定了要查询的表,后续一系列的操作会围绕这两张表展开,这里还需要注意一个概念,就是虚拟表的概念,每一个SQL操作或生成一张对应的虚拟表,FROM操作也是,这里只是说明一般执行的顺序,要想知道具体执行的细节,我想除了去仔细阅读SQL实现操作的源码没有更好的途径。所以这里FROM操作也是

    产生了虚拟表

  2. ON:这里需要了解join操作的执行逻辑,很多人都会对where和on之间执行的顺序很模糊。那么这里明确一下二者的执行顺序,显然实现执行ON操作。利用ON根据具体的join操作在由上一步产生的虚拟表中筛选出符合ON_CONDITION的数据行 ,

    又产生新的虚拟表

  3. JION:利用上一步产生的虚拟表左连接操作。关于join操作不了解的请看——

    传送门

    。还是会

    产生新的虚拟表

  4. WHERE:根据上一步产生的虚拟表,利用WHERE_CONDITION过滤去不符合的记录。又又

    产生一张虚拟表

  5. GROUP BY:将虚拟表根据已存在字段进行分组。分组概念不清楚还是看上面那个传送门。

    新的虚拟表不要忘了

    ,哈哈。
  6. HAVING:后面一般跟聚合函数,且其必须配合group by一起使用,作用是将分组后的结果根据一定条件进行过滤。

    这时又又又产生新虚拟表

  7. SELECT:将数据插入到新虚拟表的指定列,注意这里是

    新产生的虚拟表

    呀,^ _ ^.
  8. DISTINCT:去重。

    新虚拟表重于一切

  9. ORDER BY:排序。

    新…
  10. LIMIT:控制返回记录条数。

    新…(没力气再多打那三个字了,自行体会)


最后在说明下执行顺序对我们日常编写SQL的重要性,我认为这是我们能优化sql的前提,调试错误SQL的基石,定位错误的好帮手。因为之前自己也没有去想过SQL的顺序,其实是没有去想过,之前学其他编程语言的时候,总会去debug代码,这也是我们能充分理解程序执行的逻辑,帮助我门更好的提升。



版权声明:本文为zj19941201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。