首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要显式指定SQL "GROUP BY“子句中的所有列-为什么不指定"GROUP BY *"?

为什么我需要显式指定SQL "GROUP BY“子句中的所有列-为什么不指定"GROUP BY *"?
EN

Stack Overflow用户
提问于 2010-05-06 06:33:15
回答 3查看 11.2K关注 0票数 16

这一直困扰着我-为什么SQL语句中的GROUP BY子句要求我包含所有非聚合列?默认情况下,这些列应该包括在内--一种"GROUP by *“--因为我甚至不能运行查询,除非它们都包含在内。每一列都必须是聚合的,或者在"GROUP BY“中指定,但似乎任何未聚合的内容都应该自动分组。

也许它是ANSI-SQL标准的一部分,但即便如此,我也不明白为什么。有人能帮我理解一下这个约定的必要性吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-06 06:40:45

很难确切地知道SQL语言的设计者在编写标准时在想什么,但这是我的看法。

作为一般规则,SQL要求您显式地声明您的期望和意图。该语言不会尝试“猜测你的意思”,并自动填充空白处。这是一件好事,。

当你写一个查询时,最重要的考虑因素是它产生正确的results.如果你犯了一个错误,解析器通知你,而不是猜测你的意图并返回可能不正确的结果。如果你犯了一个错误,解析器可能会通知你。SQL的声明性质(声明您想要检索的内容,而不是如何检索它的步骤)已经很容易在不经意间出错。在语言语法中引入模糊性并不会使变得更好。

事实上,在我能想到的每一种情况下,语言允许使用快捷键都会带来问题。例如,以自然连接为例-您可以省略要连接的列的名称,并允许数据库根据列名推断它们。一旦列名发生变化(随着时间的推移,它们自然会发生变化),现有查询的语义就会随之发生变化。这很糟糕..。非常糟糕的-您真的不希望在数据库代码的幕后发生这种神奇的事情。

然而,这种设计选择的一个结果是是一种冗长的语言,您必须在其中显式地表达您的意图。这可能导致不得不编写比您所希望的更多的代码,并抱怨为什么某些构造如此冗长...但归根结底,事情就是这样。

票数 26
EN

Stack Overflow用户

发布于 2016-07-19 07:17:36

我能想到的保持GROUP BY子句不变的唯一逻辑原因是,您可以在分组中包含未包含在选择列中的字段。

例如。

代码语言:javascript
复制
Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

即使column3没有出现在查询的其他地方,您仍然可以根据它的值对结果进行分组。(当然,一旦您这样做了,您就不能从结果中看出为什么将记录按原样分组。)

对于绝大多数最常见的场景(按每个非聚合列进行分组),它看起来确实像是一个简单但有效的加速编码的工具。

也许是"GROUP BY *"

因为在SQL工具中允许通过结果列号(即,.GROUP BY 1,2,3,等)看起来更简单的是,允许用户在一次击键中自动包括所有非聚合域。

票数 2
EN

Stack Overflow用户

发布于 2016-05-15 03:09:34

它就像这样简单:您要求按from子句中的每一列对结果进行SQL分组,这意味着对于from子句sql中的每一列,sql引擎将在内部对结果集进行分组,然后将结果集呈现给您。因此,这就解释了为什么它要求您也提及存在于from中的所有列,因为它不可能对其进行部分分组。如果您提到了group by子句,那么group by子句只能通过对所有列进行分组来实现您的意图。这是一个数学限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2777235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档