以最一般的写法为例:
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 ,...]
执行顺序分析:
-
FROM: 指定了要查询的表,后续一系列的操作会围绕这两张表展开,这里还需要注意一个概念,就是虚拟表的概念,每一个SQL操作或生成一张对应的虚拟表,FROM操作也是,这里只是说明一般执行的顺序,要想知道具体执行的细节,我想除了去仔细阅读SQL实现操作的源码没有更好的途径。所以这里FROM操作也是
产生了虚拟表
。 -
ON:这里需要了解join操作的执行逻辑,很多人都会对where和on之间执行的顺序很模糊。那么这里明确一下二者的执行顺序,显然实现执行ON操作。利用ON根据具体的join操作在由上一步产生的虚拟表中筛选出符合ON_CONDITION的数据行 ,
又产生新的虚拟表
。 -
JION:利用上一步产生的虚拟表左连接操作。关于join操作不了解的请看——
传送门
。还是会
产生新的虚拟表
。 -
WHERE:根据上一步产生的虚拟表,利用WHERE_CONDITION过滤去不符合的记录。又又
产生一张虚拟表
。 -
GROUP BY:将虚拟表根据已存在字段进行分组。分组概念不清楚还是看上面那个传送门。
新的虚拟表不要忘了
,哈哈。 -
HAVING:后面一般跟聚合函数,且其必须配合group by一起使用,作用是将分组后的结果根据一定条件进行过滤。
这时又又又产生新虚拟表
。 -
SELECT:将数据插入到新虚拟表的指定列,注意这里是
新产生的虚拟表
呀,^ _ ^. -
DISTINCT:去重。
新虚拟表重于一切
。 -
ORDER BY:排序。
新…
-
LIMIT:控制返回记录条数。
新…(没力气再多打那三个字了,自行体会)
最后在说明下执行顺序对我们日常编写SQL的重要性,我认为这是我们能优化sql的前提,调试错误SQL的基石,定位错误的好帮手。因为之前自己也没有去想过SQL的顺序,其实是没有去想过,之前学其他编程语言的时候,总会去debug代码,这也是我们能充分理解程序执行的逻辑,帮助我门更好的提升。
版权声明:本文为zj19941201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。