[我们在HAVING
和GROUP BY
上的数据库讲师的幻灯片对此声明:
[不幸的是,由于围绕该主题的SEO如此饱和,因此几乎不可能找到可以回答我的问题的资源。我可以找到很多示例,其中HAVING
确实用于聚合,但这是否必然意味着它必须使用聚合?
根据我的理解和经验,HAVING
子句不必only使用分组属性或出现在集合中的属性(即使它[[can,与之对应的WHERE
不同)。]
HAVING
是因为WHERE
无法在组级别操作。所以,是什么使我无法使用HAVING
子句中的任何其他条件,例如普通的旧HAVING attribute = value
条件,其中attribute
既不出现在GROUP BY
中,也不出现在SELECT
中条款?从视觉上来讲,我说:
“仅选择在该列下一行具有此值的那些组。”
HAVING
类似于发生在[[after聚合中的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
键的列。这在英语中的意思是,如果查询是通过唯一/主键聚合的,则该表中的其他列可以与非聚合功能一起使用。但是,这是对通用规则的扩展,该通用规则是having
子句中的引用仅是在聚合中可用的那些引用。