【问题标题】:Does COUNT(*) always return a result?COUNT(*) 是否总是返回结果?
【发布时间】:2011-02-02 20:54:06
【问题描述】:

如果我运行如下查询:

SELECT COUNT(*) as num FROM table WHERE x = 'y'

它是否总是返回结果,即使查询不匹配任何记录?还是我需要验证并确保返回一行作为结果?

【问题讨论】:

  • @col 是的 :) ' , '
  • @col 通过不尝试并只是在这里提出问题,我猜他希望观众“点击支持”来回答他的问题。
  • @raj 我必须实际创建一个测试表并构造一个返回 0 的查询来测试它,另外,我不知道的 mysql 版本之间可能存在差异。

标签: mysql sql aggregate


【解决方案1】:

是的,它总是会返回一个数字

【讨论】:

    【解决方案2】:

    聚合函数 Count() 总是返回值

    【讨论】:

    • ...澄清:“'count'函数的返回值”总是一个非空整数,无一例外。通过提到“分组依据”,您是在引用包含查询并将“返回值”的主题从“计数函数”更改为“查询的结果集”。非分组计数查询生成包含计数返回值的单个记录的结果集。或者,分组计数查询会生成一个结果集,其中每条记录都包含一个计数值。在这种情况下,如果没有要运行计数的组,则永远不会运行计数,并且“查询返回值”是一个空集。
    【解决方案3】:

    是的,在这种情况下它会返回 0。

    【讨论】:

      【解决方案4】:

      总会有这样一行结果:

      | COUNT(*) |
      ------------
      | 0        |
      

      如果没有匹配项。

      顺便说一句,我宁愿只计算主键而不是*

      【讨论】:

      • COUNT(*) 通常与COUNT(column) 不同。计数一列检查不同的值,而不是所有记录。当然,当您计算主键时,您将获得所有记录,因为主键必须是唯一的,但这不会比 COUNT(*) 快并且可能会更慢(除非 MySQL 自动优化回 COUNT(*))。跨度>
      • @Ty W - “计算一列检查不同的值”。不,除非您指定 distinct 关键字,否则这不是真的。它计算不是 NULL 的值
      【解决方案5】:

      如果没有记录匹配,则计数将返回 0。 (所以是的,count 总是返回一个结果,除非你有一些语法错误)

      【讨论】:

        【解决方案6】:

        是的,因为它是一个聚合并返回零。 除非您添加 GROUP BY 在这种情况下没有结果,因为没有组...

        MAX/SUM 等将返回 NULL,除非您添加 GROUP BY 然后没有行。 只有 COUNT 返回一个数字,没有结果

        编辑,有点晚了:SUM 会像 MAX 一样返回 NULL

        编辑,2013 年 5 月:这适用于所有主要的 RDBMS。我想按照 ANSI 标准

        【讨论】:

        • SUM() 之类的函数会返回 0 还是 NULL?
        • @Click Upvote:对不起,我没有回答。 SUM 像 MAX 一样给出 NULL。只有 COUNT 返回 0
        • COUNT(*)的类型是什么?另请参阅 MySQL 手册中的Numeric Types
        【解决方案7】:

        是的,“count”函数本身的返回值始终是非空整数,无一例外。

        话虽如此,您可能对您的查询的返回值更感兴趣,它实际上是一个结果集。如果是这种情况,那么您只需考虑您的查询是否包含“group by”子句。

        具有聚合函数的非分组查询

        select count(*), sum(*), max(*), min(*) from table
        

        生成带有单个记录的结果集,其中包含聚合函数的返回值。在这种情况下,您的结果集将始终只有一条记录,其中的列包含您包含的任何聚合函数的返回值。在这条单独的记录中,count 的返回值将始终为非空整数,而其他聚合函数(例如 min、max 和 sum)的返回值可能为空。在上面的示例中,您返回的记录可能是“零,空,空,空”,但永远不会是“空,空,空,空”,因为 count 永远不会返回空。因此,如果您只调用“count”,那么返回的一条记录中的一列将始终包含 count 的非空返回值;因此您可以放心,您的计数查询的标量返回值将始终是一个非空整数。

        另一方面,分组查询具有聚合函数,例如

        select count(*), sum(*), max(*), min(*) from table group by column
        

        产生一个包含零个或多个记录的结果集,其中每条记录包含每个已识别组的聚合函数的返回值。在这种情况下,如果没有识别出任何组,则没有用于运行聚合函数的组,函数永远不会运行,并且“查询返回值”将是一个空集,根本没有记录。

        在没有记录的表上进行测试以查看结果:

        create table #t (c int);
        select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null}
        select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records
        drop table #t;
        

        因此,无论您调用的是 count、min、max 还是 sum,重要的是不仅要了解各个聚合函数的返回值,还要了解查询本身的“返回值”,以及该结果集是什么包含。

        【讨论】:

        • 谢谢!只是想让你知道,在 MySQL 上我无法执行 SUM(*)
        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多