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

Sql*_*yan 12 sql group-by aggregate ansi-sql sql-standards

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

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

LBu*_*kin 22

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

作为一般规则,SQL要求您明确说明您的期望和意图.该语言不会试图"猜测你的意思",并自动填写空白.这是一件好事.

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

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

然而,这种设计选择的一个结果是SQL是一种冗长的语言,您必须明确表达您的意图.这可能导致必须编写比你想象的更多的代码,并抱怨为什么某些结构如此冗长......但在一天结束时 - 它就是它的本质.