【问题标题】:In SQL, why does group by make a difference when using having count()在 SQL 中,为什么 group by 在使用有 count() 时会有所不同
【发布时间】:2012-02-12 06:40:16
【问题描述】:

我有一个存储 zone_id 的表。有时区域 ID 在数据库中是两次。我编写了一个查询来仅显示表中具有相同 zone_id 的两个或多个条目的条目。

以下查询返回正确的结果:

select *, count(zone_id)
from proxies.storage_used
group by zone_id desc
having count(zone_id) > 1;

但是,如果我按 last_updated 或 company_id 分组,它会返回随机值。如果我不添加 group by 子句,它只显示一个值,如下面的屏幕截图所示。第一个输出显示上面的查询字符串,第二个输出显示相同的查询字符串,没有'group by'行并且只返回一个值:

更正:我是新会员,所以不能直接发图,所以加了减号:http://min.us/m3yrlkSMu#1o

虽然我的查询有效,但我不明白为什么。有人可以帮助我理解为什么 group by 会改变实际输出,而不仅仅是输出分组吗?我正在使用 MySQL。

【问题讨论】:

    标签: sql count having


    【解决方案1】:

    group by 将结果行分成组,并对每个组中的记录执行聚合函数。如果您在没有 group by 的情况下执行 count(*),您将获得表中所有行的单个计数。由于您没有指定组,因此只有一个组,即表中的所有记录。如果您对区域 ID 的分组进行计数(*),您将获得每个区域 ID 有多少条记录的计数。如果您对区域 ID 和上次更新日期进行计数(*),您将获得每个区域中每个日期更新了多少行的计数。

    【讨论】:

      【解决方案2】:

      如果没有group by 子句,所有内容都存储在同一个组中,因此您会得到一个结果。如果您的表中有不止一行,那么having 将成功。因此,您最终将计算表中的所有行...

      source

      据我所知,您可以在以下两种情况下使用having 和不使用group by 创建查询:

      1. 您有一个where 子句,并且您想要测试满足该子句的所有行的聚合条件。

      2. 与上述相同,但适用于表中的所有行(但实际上,这没有意义)。

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 2012-05-16
        • 1970-01-01
        • 2018-12-22
        • 2023-01-24
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多