没有聚合功能的 GROUP BY 子句有啥原因吗?
Posted
技术标签:
【中文标题】没有聚合功能的 GROUP BY 子句有啥原因吗?【英文标题】:Any reason for GROUP BY clause without aggregation function?没有聚合功能的 GROUP BY 子句有什么原因吗? 【发布时间】:2011-01-12 22:50:42 【问题描述】:我目前正在(彻底)学习 SQL,遇到了GROUP BY
clause。
GROUP BY
根据您提供的参数对结果集进行聚合或分组。如果在查询中使用此子句,则可以对结果集执行聚合函数以查找结果集的统计信息,例如查找平均值 (AVG())
或频率 (COUNT())
。
我的问题是:如果没有附带的聚合函数,GROUP BY 语句是否有用?
更新
使用GROUP BY
作为DISTINCT
的同义词(可能)是个坏主意,因为我怀疑它会更慢。
【问题讨论】:
【参考方案1】:如果没有附带的聚合函数,GROUP BY 语句是否有用?
在这种情况下,使用 DISTINCT
是同义词,但您想要/必须定义 GROUP BY
子句的原因是为了能够定义 HAVING
子句详细信息。
如果您需要定义 HAVING
子句,您必须定义 GROUP BY
- 您不能与 DISTINCT
结合使用。
【讨论】:
@Niels:取决于数据和数据模型,但我从来没有需要我能回忆起的 IME【参考方案2】:您可以使用不带任何AGGREGATES的GROUP BY来执行DISTINCT选择。
【讨论】:
【参考方案3】:Group by 可用于两种方式主要 1)结合与 SQL 聚合函数 2)消除结果集中的重复行
所以您的问题的答案在于上述用途的第二部分。
【讨论】:
【参考方案4】:注意:以下所有内容仅适用于mysql
GROUP BY
是 guaranteed 按顺序返回结果,DISTINCT
不是。
GROUP BY
和ORDER BY NULL
与DISTINCT
具有相同的效率(并以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 子句中[重复]