SQL 查询的 HAVING 子句是否只能使用聚合函数?
Can a HAVING clause of an SQL query use ONLY aggregate functions?
我们的数据库讲师在 HAVING
和 GROUP 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
子句中的引用仅在 聚合 之后可用的一般规则的扩展。
我们的数据库讲师在 HAVING
和 GROUP 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
子句中的引用仅在 聚合 之后可用的一般规则的扩展。