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

时间:2010-03-31 10:31:26

标签: mysql sql aggregate

如果我运行查询,例如:

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

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

7 个答案:

答案 0 :(得分:46)

是的,因为它是一个聚合并返回零。 除非您添加GROUP BY,否则没有结果,因为没有组...

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

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

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

答案 1 :(得分:8)

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

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

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

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

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

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

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,重要的是不仅要了解各个聚合函数的返回值,还要了解查询本身的“返回值”以及结果集的含义。包含。

答案 2 :(得分:5)

聚合函数Count()始终返回值

答案 3 :(得分:2)

是的,它将返回一个数字

答案 4 :(得分:2)

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

答案 5 :(得分:2)

总会有一行结果如下:

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

如果没有匹配。

顺便说一下,我更愿意只计算主键而不是*

答案 6 :(得分:2)

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