SQL中的GROUP BY子句是多余的吗?
每当我们在SQL中使用聚合函数(
MIN
,MAX
,AVG
等)时,我们必须始终GROUP BY
所有非聚合列,例如:
SELECT storeid, storename, SUM(revenue), COUNT(*)
FROM Sales
GROUP BY storeid, storename
当我们在SELECT语句中使用函数或其他计算时,它变得更具侵入性,因为它也必须复制到GROUP BY子句。
SELECT (2 * (x + y)) / z + 1, MyFunction(x, y), SUM(z)
FROM AnotherTable
GROUP BY (2 * (x + y)) / z + 1, MyFunction(x, y)
如果我们更改SELECT语句,我们必须记住对GROUP BY子句进行相同的更改。
那么GROUP BY子句是多余的吗?
如果确实如此,那么为什么SQL中会出现GROUP BY子句呢?
如果不是这样,那么GROUP BY为我们提供了哪些额外功能?
没有找到相关结果
已邀请:
4 个回复
席酱
如果不是这样,那么GROUP BY为我们提供了哪些额外功能? 指定分组内容的唯一方法是使用GROUP BY子句。您不一定要从SELECT中提到的列中推断出它。实际上,您甚至不必选择GROUP BY中提到的所有列:
场竟矩喘崩
在这种情况下,我只想要相同名字,相同地址配置文件的数量。 正如你所看到的,我不必在
声明中重复
的“复杂”操作。 我认为允许这种“有时像这样,有时候就是这样”,你不得不在大多数情况下不得不重复。
搂腹时
子句不是多余的 - 它的功能是定义聚合函数的工作范围。您认为优化器应该从SELECT子句中读取以了解分组的范围,但最早可以在
子句中访问列别名(MySQL除外,其中
和
子句支持列别名)。目前,没有办法支持你的期望。 ANSI标准很好,但实际情况是ANSI标准并非由供应商完全实现。这是狩猎& peck支持,就像PostgreSQL 8.4+支持比Oracle更多的分析功能(当然比SQL Server更多)。 MySQL和SQLite支持省略
中的列,但根据文档,这些列值是任意的 - 不能保证一致地返回值。并且分组的范围也不同,这有可能对返回的结果集产生巨大影响。然后是在需要移植到其他数据库时依赖供应商特定语法的问题,因为DB2,Oracle,SQL Server和PostgreSQL不支持该功能。 但随着分析/窗口/排名功能的出现,您可以在没有GROUP BY的情况下获得聚合功能。 IE:
它更冗长,并且容易出错,因为您无法定义适用于查询中所有分析函数的
/
。目前......但Google Analytics不会很快取代聚合 - 支持从Oracle 9i,SQL Server 2005+和PostgreSQL 8.4+开始。我知道DB2支持分析,但我不知道除此之外的细节。
葛瞎说漓
在
之后,需要总和知道如何总结。 但是
之后的
是可选的。你想要的结果如何,不会影响到
就像BeemerGuy所说,2并不总是与1相同。