使用相同的 SQL 查询选择聚合和列?

问题描述 投票:0回答:1

我正在参加 SQL 数据库竞赛,偶尔会遇到类似的问题

SELECT name, MIN(a) 
FROM table

根据答卷,输出的姓名是不确定的。然而,在后来的实践测试中,我被要求找到此类查询的确切输出,这意味着有一种方法可以确定返回的名称值。

答案有时会出现错误(为了安慰而经常犯错)。因此,我在 W3Schools 尝试框中运行了类似的查询,但出现了错误。但是,我在 Codecademy 中尝试过,它返回了与最小“a”值关联的名称值。

有太多相互矛盾的信息,我不知道该怎么想!

sql aggregate-functions
1个回答
0
投票

一般规则:如果您在

SELECT
子句中进行聚合,并且某些列未聚合,则应将它们列在
GROUP BY
子句中。

作为示例,这就是 Postgres 的描述,其中我的突出显示为粗体:

当存在 GROUP BY 或存在任何聚合函数时,SELECT 列表表达式引用未分组的列是无效的,除非在聚合函数中或者当未分组的列在功能上依赖于分组的列时,因为否则为未分组的列返回多个可能的值。如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖性。

MySQL 还有一个关于该主题的简洁的 帮助页面 ,原因我稍后会详细介绍。

如果禁用 ONLY_FULL_GROUP_BYGROUP BY 标准 SQL 使用的 MySQL 扩展允许选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列,即使这些列在功能上不依赖于 GROUP BY 列.

如所写,MySQL 接受在

GROUP BY
子句中省略列的查询,包括省略所有列的情况(= 整个子句被省略),但这是标准的例外
如果
ONLY_FULL_GROUP_BY
选项关闭,那么它将允许执行这样的查询,但您为非聚合列
name
获得的值将是数据库在读取表时遇到的第一个值。
据我所知,MySQL 是唯一允许此类查询的 DBMS。我想大多数人都会同意即使 DBMS 允许,你也不应该省略非聚合列,因为它是非标准的。

为了完整起见,如果您仔细阅读这两句话,您一定已经注意到该标准实际上允许在一种情况下省略非聚合列:

如果它们在功能上依赖于聚合列。 我的结论是,您设法使查询在 MySQL (Codecademy) 实例上运行,但在其他地方失败了。

© www.soinside.com 2019 - 2024. All rights reserved.