没有聚合功能的 GROUP BY 子句有啥原因吗?

Posted

技术标签:

【中文标题】没有聚合功能的 GROUP BY 子句有啥原因吗?【英文标题】:Any reason for GROUP BY clause without aggregation function?没有聚合功能的 GROUP BY 子句有什么原因吗? 【发布时间】:2011-01-12 22:50:42 【问题描述】:

我目前正在(彻底)学习 SQL,遇到了GROUP BYclause。

GROUP BY 根据您提供的参数对结果集进行聚合或分组。如果在查询中使用此子句,则可以对结果集执行聚合函数以查找结果集的统计信息,例如查找平均值 (AVG()) 或频率 (COUNT())

我的问题是:如果没有附带的聚合函数,GROUP BY 语句是否有用?

更新 使用GROUP BY 作为DISTINCT 的同义词(可能)是个坏主意,因为我怀疑它会更慢。

【问题讨论】:

【参考方案1】:

如果没有附带的聚合函数,GROUP BY 语句是否有用?

在这种情况下,使用 DISTINCT 是同义词,但您想要/必须定义 GROUP BY 子句的原因是为了能够定义 HAVING 子句详细信息。

如果您需要定义 HAVING 子句,您必须定义 GROUP BY - 您不能与 DISTINCT 结合使用。

【讨论】:

@Niels:取决于数据和数据模型,但我从来没有需要我能回忆起的 IME【参考方案2】:

您可以使用不带任何AGGREGATESGROUP BY来执行DISTINCT选择。

【讨论】:

【参考方案3】:

Group by 可用于两种方式主要 1)结合与 SQL 聚合函数 2)消除结果集中的重复行

所以您的问题的答案在于上述用途的第二部分。

【讨论】:

【参考方案4】:

注意:以下所有内容仅适用于mysql

GROUP BY 是 guaranteed 按顺序返回结果,DISTINCT 不是。

GROUP BYORDER BY NULLDISTINCT 具有相同的效率(并以say 方式实现)。如果正在聚合(或区分)的字段上有索引,则两个子句都对该字段使用松散索引扫描。

GROUP BY 中,您可以返回非分组和非聚合表达式。 MySQL 将从相应组中选择任何随机值来计算表达式。

使用GROUP BY,您可以省略SELECT 子句中的GROUP BY 表达式。使用DISTINCT,您不能。 DISTINCT 返回的每一行都保证是唯一的。

【讨论】:

【参考方案5】:

它不仅用于聚合函数。

例如,考虑以下代码:

SELECT product_name, MAX('last_purchased') FROM products GROUP BY product_name

这将只返回每个产品的 1 个结果,但包含该记录的最新更新值。

【讨论】:

MAX() 是一个聚合函数。 @am:Neils 询问没有聚合功能的用途 它不聚合,它从列表中选择单个值。 聚合是集合在一起形成总量的项目集合 它是一个聚合,因为它接受一组值,每个值来自不同的行并返回一个结果——这就是 SQL 中聚合函数的定义。 @Max,被认为是不公平的语言差异:),我猜我没有正确理解 Q。

以上是关于没有聚合功能的 GROUP BY 子句有啥原因吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?

列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]

SQL中只要用到聚合函数就一定要用到group by 吗?

聚合函数 和 group by

查询没有重复和聚合函数或 GROUP BY 子句问题。 - 重复

为啥没有聚合函数的选择列需要成为 MySQL 中 Group by 子句的一部分?