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

时间:2019-10-05 23:45:52

标签: sql having

我们在HAVINGGROUP BY上的数据库讲师的幻灯片对此做出了声明:


enter image description here

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

根据我的理解和经验,HAVING子句不必使用分组属性或出现在集合中的属性(即使它可以,其对应的WHERE)。

据我了解,之所以创建HAVING是因为WHERE无法在组一级进行操作。

因此,正是阻止我使用HAVING子句中的任何其他条件的原因,例如普通的旧HAVING attribute = value条件,其中attribute都没有出现在{{1} }或GROUP BY子句中的汇总?从视觉上来讲,我说:

“仅选择在此列下有该行的那些组。”

1 个答案:

答案 0 :(得分:2)

WARNING: Could not generate requirement for distribution -atplotlib 2.2.2 (c:\pr ogramdata\anaconda3\lib\site-packages): Parse error at "'-atplotl'": Expected W: (abcd...) matplotlib==3.1.1 matplotlib-venn==0.11.5 就像一个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子句中的引用仅在聚合后 后可用。