COUNT(*) 是不是总是返回结果?

Posted

技术标签:

【中文标题】COUNT(*) 是不是总是返回结果?【英文标题】: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 版本之间可能存在差异。 【参考方案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(*)

以上是关于COUNT(*) 是不是总是返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

JSON .count 数组在 Swift 4 中总是返回 0

PHP运行查询关闭每个数组变量并返回表中的结果

使用 COUNT() 仅返回每个学生一个结果

带有 COUNT 和 ORDER 的 SPARQL 查询返回奇数结果

Mysql的count查询,如果没有结果返回NULL,怎么让他返回0

带有 COUNT() 函数的 SQL 联合未返回预期结果