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

Cli*_*ote 31 mysql sql aggregate

如果我运行查询,例如:

SELECT COUNT(*) as num FROM table WHERE x = 'y'
Run Code Online (Sandbox Code Playgroud)

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

gbn*_*gbn 46

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

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

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

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

  • @Click Upvote:抱歉,我没有回答.SUM像MAX一样给出NULL.只有COUNT返回0 (2认同)

Tri*_*nko 8

是的,"count"函数本身返回值总是一个非空整数,没有异常.

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

一个非分组查询中包含聚合函数

select count(*), sum(*), max(*), min(*) from table
Run Code Online (Sandbox Code Playgroud)

生成一个结果集,其中包含一个包含聚合函数返回值的记录.在这种情况下,结果集将始终只有一条记录,其中的列包含您包含的任何聚合函数的返回值.在此单独记录中,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
Run Code Online (Sandbox Code Playgroud)

生成具有零个或多个记录的结果集,其中每个记录包含所标识的每个组的聚合函数的返回值.在这种情况下,如果没有标识组,则没有用于运行聚合函数的组,函数永远不会运行,并且"查询返回值"将是一个空集,根本没有记录.

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

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;
Run Code Online (Sandbox Code Playgroud)

因此,无论您是调用count,min,max还是sum,重要的是不仅要了解各个聚合函数的返回值,还要了解查询本身的"返回值"以及结果集包含的内容.


Axa*_*dax 5

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

  • ...除非你添加GROUP BY? (3认同)
  • ...澄清一下:“'计数'函数的返回值”总是一个非空整数,无一例外。通过提及“分组依据”,您引用的是包含的查询,并将“返回值”的主题从“计数函数”更改为“查询的结果集”。未分组的计数查询将产生包含count返回值的单个记录的结果集。或者,分组计数查询会产生一个结果集,其中每个记录都包含一个计数值。在这种情况下,如果没有要继续进行计数的组,则永远不会运行计数,并且“查询返回值”为空集。 (2认同)