我正在参加 SQL 数据库竞赛,偶尔会遇到类似的问题
SELECT name, MIN(a)
FROM table
根据答卷,输出的姓名是不确定的。然而,在后来的实践测试中,我被要求找到此类查询的确切输出,这意味着有一种方法可以确定返回的名称值。
答案有时会出现错误(为了安慰而经常犯错)。因此,我在 W3Schools 尝试框中运行了类似的查询,但出现了错误。但是,我在 Codecademy 中尝试过,它返回了与最小“a”值关联的名称值。
有太多相互矛盾的信息,我不知道该怎么想!
一般规则:如果您在
SELECT
子句中进行聚合,并且某些列未聚合,则应将它们列在 GROUP BY
子句中。
作为示例,这就是 Postgres 的描述,其中我的突出显示为粗体:
当存在 GROUP BY 或存在任何聚合函数时,SELECT 列表表达式引用未分组的列是无效的,除非在聚合函数中或者当未分组的列在功能上依赖于分组的列时,因为否则为未分组的列返回多个可能的值。如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖性。
MySQL 还有一个关于该主题的简洁的 帮助页面 ,原因我稍后会详细介绍。
如果禁用 ONLY_FULL_GROUP_BY,GROUP BY 标准 SQL 使用的 MySQL 扩展允许选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列,即使这些列在功能上不依赖于 GROUP BY 列.
如所写,MySQL 接受在
GROUP BY
子句中省略列的查询,包括省略所有列的情况(= 整个子句被省略),但这是标准的例外。ONLY_FULL_GROUP_BY
选项关闭,那么它将允许执行这样的查询,但您为非聚合列 name
获得的值将是数据库在读取表时遇到的第一个值。如果它们在功能上依赖于聚合列。 我的结论是,您设法使查询在 MySQL (Codecademy) 实例上运行,但在其他地方失败了。