答案
在SQL查询中,SELECT
和HAVING
子句的执行顺序并不是按照字面上的顺序来执行的。实际上,SELECT
和HAVING
子句的逻辑执行顺序是:
FROM
和 JOIN
(确定数据来源和如何联接它们)WHERE
(对从FROM
和JOIN
得到的记录进行过滤)GROUP BY
(对过滤后的记录进行分组)- 聚合函数(如
SUM()
)在GROUP BY
之后计算 HAVING
(对分组后的聚合结果进行过滤)SELECT
(选择需要的列,包括聚合函数的结果)
所以,虽然SELECT
子句在SQL语句中出现在HAVING
子句之前,但在逻辑执行顺序上,聚合函数(如SUM(num) as all_num
)的计算是在HAVING
子句过滤之前完成的。
在你提供的例子中,SUM(num) as all_num
这个聚合计算是在HAVING all_num > 50
之前完成的。换句话说,SQL先计算所有组的num
字段之和,然后给这个结果起个别名all_num
,接着使用这个all_num
的结果去过滤那些和大于50的组。
因此,尽管SELECT
和HAVING
在SQL语句中的位置看起来像是先SELECT
后HAVING
,实际上聚合函数(在SELECT
中定义)的计算和HAVING
过滤是在一个逻辑阶段完成的,这个逻辑阶段在SELECT
列选择之后。这意味着,在逻辑上,SQL会先计算聚合结果,然后再使用HAVING
子句来过滤这些聚合结果。
希望这个解释能够解答你的疑惑。
你说的没错,我觉得你只是混淆了select的作用。这里的select的意思是做完having子组筛选后把结果选择出来展示,而不是对数据作操作拿给having去做子组筛选
我们理一下顺序:
1.group by先分组
2.sum()聚合函数执行算出每个组的总和(它不依赖于select这个动作)
3.having子句对子组总和结果作筛选
4.select把结果
选择性
展示出来