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 返回 0COUNT(*)
的类型是什么?另请参阅 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
带有 COUNT 和 ORDER 的 SPARQL 查询返回奇数结果