在SQL SELECT语句中,HAVING和WHERE的区别是什么?

编辑:我已经把Steven的答案标记为正确答案,因为它包含了链接上的关键信息:

当GROUP BY没有被使用时,HAVING就像一个WHERE子句

我在WHERE中看到的情况没有GROUP BY,这就是我的困惑开始的地方。当然,在你知道这一点之前,你不能在问题中指定它。


当前回答

一种理解方法是,having子句是where子句的附加过滤器。

WHERE子句用于从结果中过滤记录。筛选器发生在任何分组之前。HAVING子句用于从组中筛选值

其他回答

当GROUP BY不使用时,WHERE和HAVING子句本质上是等价的。

然而,当使用GROUP BY时:

WHERE子句用于从结果中筛选记录。的 在进行任何分组之前进行筛选。 HAVING子句用于从一个组(即到 执行分组聚合后检查条件)。

来自这里的资源

WHERE和HAVING子句的区别:

WHERE子句和HAVING子句之间的主要区别是,WHERE用于行操作,HAVING用于列操作。

为什么我们需要HAVING从句?

我们知道,聚合函数只能在列上执行,所以不能在WHERE子句中使用聚合函数。因此,我们在HAVING子句中使用聚合函数。

两者之间的区别在于与GROUP BY子句的关系:

WHERE在GROUP BY之前;SQL在对记录进行分组之前计算WHERE子句。 HAVING继GROUP BY之后;SQL在对记录进行分组后计算HAVING。

参考文献

SQLite SELECT语句语法/铁路图 Informix SELECT语句语法/铁路图

我使用HAVING来约束基于聚合函数结果的查询。例如:select * in blahblahblah group by SOMETHING having count(SOMETHING)>0

当GROUP BY不使用时,WHERE和HAVING子句本质上是等价的。

然而,当使用GROUP BY时:

WHERE子句用于从结果中筛选记录。的 在进行任何分组之前进行筛选。 HAVING从句是 用于从一个组中过滤值(即,检查后的条件 已经执行了分组聚合)。