为啥 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
的不是SUM
和MAX
,而是未聚合的 列。
如果你只是这样写,你会得到一行,对于整个表中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) 不会返回最高等级?