sql子句的执行顺序决定了where子句是无法使用字段别名来作为筛选条件的,也无法使用聚合函数

先说一个结论,sql语句中的where子句是无法使用字段别名来作为筛选条件的,也无法使用聚合函数。原因如下:

这涉及到SQL语句的整个执行顺序

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

执行顺序依次为:

FROM:先确定查询范围
ON:确定多表联合查询的条件
JOIN:指定联合哪些数据表
WHERE :全表查询的筛选条件,生成第一个结果集
GROUP BY:分组条件,对第一个结果集进行分组,得到第二个结果集
HAVING :过滤条件,与group by进行连用,对第二个结果集中的每组数据,进行筛选过滤,得到第三个结果集
SELECT:指定获取的列项,得到第四个结果集
DISTINCT :对指定列进行去重操作
ORDER BY:对结果集按照指定字段进行排序整理
LIMIT:对最终结果集进行截取,一般和offset连用,可用于分页

所以,以此可以看出,为什么在where语句中没法使用查询列的别名进行过滤了,因为调用where子句的时候,select子句还没有开始执行,所以不识别。
另外,由于聚合函数是对结果集进行运算的,where子句中还没有产生结果集,此时还处于“确定”结果集的过程中,因而不能使用聚集函数。

posted @ 2024-01-18 12:17  少年不太冷2  阅读(35)  评论(0)    收藏  举报