【问题标题】: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 的同义词(可能)是个坏主意,因为我怀疑它会更慢。

【问题讨论】:

    标签: sql mysql group-by aggregate


    【解决方案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 BYguaranteed 按顺序返回结果,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。
          猜你喜欢
          • 1970-01-01
          • 2013-03-22
          • 2014-11-23
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          相关资源
          最近更新 更多