代码之家  ›  专栏  ›  技术社区  ›  SqlRyan

为什么需要显式指定SQL“groupby”子句中的所有列-为什么不指定“groupby*”?

  •  12
  • SqlRyan  · 技术社区  · 14 年前

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

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

    3 回复  |  直到 14 年前
        1
  •  25
  •   LBushkin    14 年前

    很难确切地知道SQL语言的设计者在编写标准时是怎么想的, 但我的意见是 .

    “猜猜你的意思” ,并自动填空。 .

    在编写查询时,最重要的考虑是 产生正确的结果 . 在语言语法中引入模糊性并不能使之更好 .

    快捷方式 造成了问题。以自然联接为例,您可以省略要联接的列的名称,并允许数据库根据列名推断它们。一旦列名发生变化(随着时间的推移,它们自然会发生变化) -现有查询的语义也随之改变 . 这很糟糕。。。非常糟糕 -你真的不想这样吗 魔术 发生在数据库代码的幕后。

    然而,这种设计选择的一个结果是,SQL是一种冗长的语言,您必须在其中显式地表达您的意图。

        2
  •  2
  •   jkdev james murphy    8 年前

    我能想到的唯一合乎逻辑的理由就是 GROUP BY 子句,因为您可以在分组中包含未包含在选择列中的字段。

    Select column1, SUM(column2) AS sum
     FROM table1
     GROUP BY column1, column3
    

    即使column3在查询的其他地方没有表示,您仍然可以按它的值对结果进行分组(当然,一旦您这样做了,您就无法从结果中判断为什么要按原来的方式对记录进行分组。)

    对于大多数最常见的场景(按每个非聚合列分组)来说,这似乎是一个简单而有效的加速编码的工具。

    也许 "GROUP BY *"

    因为在SQL工具中,允许按结果列号(即。 GROUP BY 1,2,3,

        3
  •  0
  •   efdusernet    8 年前

    很简单,就像这样:您要求sql按from子句中的每一列对结果进行分组,这意味着对于from子句sql中的每一列,sql引擎都会在内部对结果集进行分组,然后再将其呈现给您。所以这就解释了为什么它要求你提到from too中的所有列,因为它不可能将它部分地分组。如果您提到GROUPBY子句,那么只有通过对所有列进行分组,sql才能达到您的目的。这是一个数学限制。