【问题标题】:Group by and having trouble understanding分组并难以理解
【发布时间】:2019-06-01 05:26:32
【问题描述】:

我正在查看我在 Access 数据库中的一些我没有创建的 SQL 查询。

其中一个 SQL 查询如下所示:

select column1 from table1 group by column1 having count(*)>1

此查询的目的是查找column1 中出现多次的值。我可以验证此查询是否正常工作并返回多次出现的列值。

但是我不明白为什么这个查询有效。根据我的理解,使用 group by 将删除重复的字段。例如,如果 column1 有

    column1
    apple
    mango
    mango

执行group by (column1) 将导致

    column1
    apple
    mango

此时,如果我们执行having count(*)>1having count(column1)>1,它应该不会返回任何结果,因为 group by 已经删除了重复字段。但很明显,我错了,因为上面的 SQL 语句确实给出了准确的结果。

您能告诉我我理解的问题吗?

编辑 1:

除了公认的答案,我this处理SQL操作顺序的文章确实帮助我理解了

【问题讨论】:

  • Having 子句适用于由于分组而形成的行组。分组的结果是苹果和芒果两组。在这些组中的每一个上,我们都运行 having 子句。苹果组有 1 行,芒果有 2 行。这就是它的工作原理
  • HAVING 标准将只返回 Mango 行,因为它是唯一一个计数 >1 的组。

标签: sql ms-access select group-by


【解决方案1】:

您误解了HAVING 的工作原理。事实上,你可以通过使用子查询来考虑它。您的查询相当于:

select column1
from (select column1, count(*) as cnt
      from table1
      group by column1
     ) as t
having cnt > 1;

也就是说,having 在聚合发生后过滤聚合查询。然而,聚合函数是每组应用的。所以count(*) 正在计算每组中的行数。这就是它识别重复项的原因。

【讨论】:

    【解决方案2】:

    group by 不只是删除重复值 - 它为 group by 子句的每个不同值返回一行,并允许您为每个此类唯一值应用聚合函数。

    在此查询中,您实际上查询了column1 的值和count(*) 的结果每个列1 的值,然后,您使用having 子句仅返回column1count(*) 大于 1。

    【讨论】:

      【解决方案3】:

      GROUP BY 子句根据您提到的字段对选择进行分组,在这种情况下 column1 但可以是组合列(例如 column1、column2)。 顺便说一句,我想如果你跑:

      SELECT column1, Count(*) AS [Count], MIN(column2) AS MinColumn2, MAX(column2) AS MaxColumn2
      FROM table1 
      GROUP BY column1;
      

      将帮助您了解 GROUPING 的工作原理。当直接按任何列过滤时,您可以使用 WHERE 条件,但如果您想根据分组计算的任何字段进行过滤,则需要使用 HAVING 子句。

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2014-11-15
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多