为啥 MAX 语句需要 Group By?

Posted

技术标签:

【中文标题】为啥 MAX 语句需要 Group By?【英文标题】:Why does MAX statement require a Group By?为什么 MAX 语句需要 Group By? 【发布时间】:2021-11-07 19:47:09 【问题描述】:

我理解为什么第一个查询需要GROUP BY,因为它不知道将总和应用于哪个日期,但我不明白为什么第二个查询会出现这种情况。最终是最大金额的值已包含在表中 - 它不像SUM 那样计算。谢谢

-- First Query
select
    sum(OrderSales),OrderDates
From Orders


-- Second Query
select
    max(FilmOscarWins),FilmName
From tblFilm

【问题讨论】:

提示:SSMS 不是数据库,它只是一个与之对话的程序。实际的数据库是 Microsoft SQL Server,因此您需要使用该标签来询问有关它的问题。 【参考方案1】:

需要GROUP BY 的不是SUMMAX,而是未聚合的 列。

如果你只是这样写,你会得到一行,对于整个表中FilmOscarWins 列的最大值:

        select
            max(FilmOscarWins)
        From
            tblFilm

如果任何一部电影获得的奥斯卡奖最多是 12 部,那一排就是 12 部。但可能会有多部电影,所有的电影都获得了 12 部奥斯卡奖,所以如果我们要求在这 12 部旁边加上FilmName,则没有一个答案。

通过添加Group By,我们从根本上改变了查询:而不是返回一个数字整个表,它将返回一行每个组 - 这在这种情况下,表示每部电影有一行。

如果您确实想获得所有获得最多 12 座奥斯卡奖的电影的列表,则必须执行一些更复杂的操作,例如使用子查询首先找到单个数字 (12),然后找到所有匹配它的行:

select
     FilmOscarWins,
     FilmName
From
     tblFilm
Where FilmOscarWins = (
        select
            max(FilmOscarWins)
        From
            tblFilm
)    

【讨论】:

谢谢。如果只有一个答案,比如只有 1 条记录的最大值,是否仍然会出现错误,因为解释器(我认为这就是 SMSS 是什么?)根本不会让这样的查询存在,即使这样可以做一张桌子吗? 是的,数据库(SQL Server 本身,而不是 SSMS;尽管 SSMS 可能会发现问题并给您提前警告)会拒绝查询,因为 不合逻辑,甚至在查看之前数据。 (您可能会遇到的一个例外是在不同的数据库系统 mysql 中,它具有允许查询并有效地随机选择一行的模式;通常认为最好关闭该模式。) 是的,因为查询是在执行之前解析和编译的,所以它必须在语法和功能上正确;在执行查询之前,SQL Server 无法知道要查找哪些数据,此时执行计划已经存在。此外,考虑一下如果 SQL Server 确实 允许您的语法会发生什么,因为它在编译时检查数据 - 一旦数据发生更改,执行计划就会失效并且缓存不再有意义.【参考方案2】:

如果您想要获得奥斯卡奖最多的电影,请使用select top

select top (1) f.*
From tblFilm f
order by FilmOscarWins desc;

在聚合查询中,select 列需要与group by 列保持一致——select 中未聚合的列必须与group by 匹配。

【讨论】:

以上是关于为啥 MAX 语句需要 Group By?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL: GROUP BY + HAVING MAX(...) --- 为啥 HAVING MAX(grade) 不会返回最高等级?

在 SQL 中检索没有 group by 语句的列值

怎么使用group by?

查找记录的属性是 GROUP BY 语句中某物的 MAX?

SQL --------------- GROUP BY 函数

sql查询中如何用group by查询出完整的一行记录?