SQL 查询的 HAVING 子句是否只能使用聚合函数?

Can a HAVING clause of an SQL query use ONLY aggregate functions?

我们的数据库讲师在 HAVINGGROUP BY 上的讲座幻灯片提出了这一主张:


不幸的是,因为围绕这个主题的 SEO 太饱和了,几乎不可能找到回答我问题的来源。我可以找到很多示例,其中 HAVING 确实与聚合一起使用,但这是否必然意味着它必须使用聚合?

根据我的理解和经验,HAVING 子句不需要 使用分组属性或聚合中出现的属性(即使它 can,不像它的对应物 WHERE).

据我了解,创建HAVING是因为WHERE无法在组级别运行。

那么,究竟是什么阻止我在 HAVING 子句中使用任何其他条件,例如普通的旧 HAVING attribute = value 条件,其中 attribute 既不出现在 GROUP BY 也不是 SELECT 子句中的聚合?从视觉上来说,我说:

"Pick only those groups where there's a row that has this value under this column."

HAVING 就像 聚合之后发生的 WHERE 子句。以下两个查询在功能上是相同的(假设省略号是兼容的):

select key1, key2, . . . 
from t
group by key1, key2
having . . .

和:

select x.*
from (select key1, key2, . . . 
      from t
      group by key1, key2
     ) x
having . . .

having子句可以参考:

  • 来自 select 的聚合值。
  • 来自 group by 的密钥。
  • 不带参数的函数(例如当前日期)。
  • 由以上组成的表达式。

它不能引用不是键的未聚合列。 group by.

生成的结果集中根本不存在此类列

这有一个例外,我冒着混淆的风险进行解释。一些数据库支持在功能上依赖于 group by 键的列。这在英语中的意思是,如果查询由 unique/primary 键聚合,则该 table 中的其他列可以与非聚合函数一起使用。但是,这是对 having 子句中的引用仅在 聚合 之后可用的一般规则的扩展。