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

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

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

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


当前回答

HAVING在使用聚合(例如GROUP BY)时使用。

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

其他回答

HAVING在使用聚合(例如GROUP BY)时使用。

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

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

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

参考文献

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

的搜索条件 group或在SELECT语句中使用的聚合函数。

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

然而,当使用GROUP BY时:

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

来自这里的资源

在聚合查询中(使用聚合函数的任何查询),Where子句中的谓词在生成聚合中间结果集之前求值,

Having子句中的谓词在聚合结果集生成后应用于聚合结果集。这就是为什么聚合值的谓词条件必须放在Having子句中,而不是放在Where子句中,以及为什么可以在Having子句中使用Select子句中定义的别名,而不能在Where子句中使用。