2010-03-31 131 views
28

如果我运行一个查询,如:COUNT(*)总是返回结果吗?

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

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

+9

难以测试吗? – 2010-03-31 10:33:53

+0

@col yea :)',' – 2010-03-31 10:34:36

+1

@col没有尝试,只是想在这里,我想他希望观众“点击Upvote”他的问题。 – raj 2010-03-31 10:37:13

回答

42

是的,因为它是一个总量和返回零。 除非您添加GROUP BY,在没有组的情况下没有结果...

MAX/SUM等将返回NULL,除非您添加GROUP BY,否则无行。 只算返回任何结果

编辑,有点晚了一些:SUM将返回NULL像MAX

编辑,2013年5月:这适用于所有主要的RDBMS。我猜根据ANSI标准

+0

它说我可以在11分钟内接受,wtf ... – 2010-03-31 10:35:57

+0

SUM()函数怎么样,它们会返回0还是NULL? – 2010-03-31 10:36:50

+2

@Click Upvote:对不起,我没有回答。 SUM给出像MAX一样的NULL值。只有COUNT返回0 – gbn 2011-01-18 06:04:09

2

是它会返回一个数字总是

5

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

+3

...除非您添加GROUP BY? – gbn 2010-03-31 10:37:12

+1

...澄清:“计数'函数的返回值总是一个非空整数,毫无例外。通过提及“group by”,您引用了包含的查询,并将“返回值”的主题从“count function”更改为“query的结果集”。非分组计数查询会生成包含计数返回值的单个记录的结果集。或者,分组计数查询会生成一个结果集,其中每个记录都包含一个计数值。在这种情况下,如果没有要运行的计数组,则count永远不会运行,并且“查询返回值”是一个空集。 – Triynko 2011-12-08 20:41:48

2

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

2

总会有结果的一排这样的:

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

如果没有匹配。

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

+2

'COUNT(*)'与一般的COUNT(列)不同。计数列将检查不同的值,而不是所有的记录。当然,当你计算你的主键时,你将得到所有的记录,因为主键必须是唯一的,但这不会比COUNT(*)'快,并且可能会更慢(除非MySQL自动优化回COUNT(* )')。 – 2010-03-31 17:27:03

+3

@Ty W - “计数列检查不同的值”。不,这是不正确的,除非你指定'distinct'关键字。它计算的值不是'NULL' – 2011-01-18 13:40:08

2

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

7

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

说了这么多,你可能会更感兴趣的是你查询,这实际上是一个结果集的返回值。如果是这样的话,那么你只需要考虑你的查询是否包含“group by”子句。与集合函数

非分组查询

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

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

在另一方面,与集合函数的分组查询

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

产生具有零个或多个记录的结果集,其中每个记录包含聚合函数的返回值( s)为每个组确定。在这种情况下,如果没有标识的组,则不会运行集合函数的组,函数将永远不会运行,并且“查询返回值”将是一个完全没有记录的空集。

测试出来的,没有记录的表看到的结果:

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; 

所以,不管你调用计数,最小值,最大值或总和,重要的是不仅可以了解的返回值的单个集合函数,还包括查询本身的“返回值”以及结果集包含的内容。

+0

谢谢!只是想让你知道在MySQL上我不能执行SUM(*)。 – CMCDragonkai 2015-12-24 03:38:42