我们在HAVING
和GROUP BY
上的数据库讲师的幻灯片对此做出了声明:
不幸的是,由于围绕该主题的SEO如此饱和,因此几乎不可能找到可以回答我的问题的资源。我可以找到很多示例,其中HAVING
确实与聚合一起使用,但这是否必然意味着它必须使用聚合?
根据我的理解和经验,HAVING
子句不必仅使用分组属性或出现在集合中的属性(即使它可以,其对应的WHERE
)。
据我了解,之所以创建HAVING
是因为WHERE
无法在组一级进行操作。
因此,正是阻止我使用HAVING
子句中的任何其他条件的原因,例如普通的旧HAVING attribute = value
条件,其中attribute
都没有出现在{{1} }或GROUP BY
子句中的汇总?从视觉上来讲,我说:
“仅选择在此列下有该行的那些组。”
答案 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
子句中的引用仅在聚合后 后可用。