SQL92语法
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT
SQL99语法
SELECT ...
FROM ... (LEFT / RIGHT) JOIN ... ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
SQL语句的执行顺序
SQL语句执行的先后顺序为:FROM
-> CROSS JOIN
->ON
-> (LEFT/RIGHT) JOIN
-> WHERE
-> GROUP BY
-> HAVING
-> SELECT
-> DISTINCT
-> ORDER BY
-> LIMIT
。
- FROM阶段。如果这个阶段存在多表查询,则还需要经历
1.1. CROSS JOIN得到笛卡儿积,得到虚拟表vt1-1;
1.2. ON进行筛选,得到虚拟表vt1-2;
1.3. LEFT/RIGHT JOIN,添加外部行,得到vt1-3。
FROM阶段后,得到原始数据,即虚拟表vt1。 - WHERE阶段,对vt1进行过滤,得到虚拟表vt2。
- GROUP BY阶段,对vt2分组,得到虚拟表vt3。
- HAVING阶段,对vt3进行过滤,得到虚拟表vt4。
- SELECT阶段,从vt4中提取想要的字段,得到虚拟表vt5。
- DISTINCT阶段,对vt5去重,得到vt6。
- ORDER BY阶段,按指定字段进行排序,得到vt7。
- LIMIT阶段,从vt7中取出指定行,得到vt8,即最终的结果。
SQL语句的执行顺序很好地解释了:
- 为什么 ORDER BY中可以使用列的别名,而WHERE中不可以使用列的别名(因为WHERE在前,SELECT其次,最后是ORDER BY)。
- 为什么 如果过滤条件中包含聚合函数,必须用HAVING, 不能用WHERE(因为WHERE在GROUP BY前,HAVING在GROUP BY后)。
- 为什么 如果过滤条件中没有聚合函数时,虽然WHERE、HAVING都可以用,但推荐使用WHERE,WHERE的执行效率会更高(因为FROM … WHERE … GROUP BY… 是先过滤再分组,而FROM… GROUP BY …HAVING…是先分组再过滤)。
相关链接
使用ORDER BY 排序
使用HAVING过滤分组