以最一般的写法为例:
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代码,这也是我们能充分理解程序执行的逻辑,帮助我门更好的提升。