mySQL / SQL中count(0),count(1)..和count(*)有什么区别?

时间:2013-08-17 16:33:48

标签: mysql sql

我最近在接受采访时被问到这个问题。 我在mySQL中尝试了这个,得到了相同的结果(最终结果)。 All给出了该特定表中的行数。 任何人都可以解释它们之间的主要区别。

9 个答案:

答案 0 :(得分:46)

没有什么,除非你在一个表中指定一个字段或在parantheses中指定一个表达而不是常量值或*

让我给你一个详细的答案。 Count将给出给定字段的非空记录号。假设您有一个名为A

的表
select 1 from A
select 0 from A
select * from A

将返回相同数量的记录,即表A中的行数。仍然输出不同。如果表中有3条记录。用X和Y作为字段名称

select 1 from A will give you

1
1
1

select 0 from A will give you
0
0
0

select * from A will give you ( assume two columns X and Y is in the table )
X      Y
--     --
value1 value1
value2 (null)
value3 (null)

因此,所有三个查询都返回相同的数字。除非你使用

select count(Y) from A 

因为只有一个非空值,你将获得1作为输出

答案 1 :(得分:32)

COUNT(*)将计算行数,而COUNT(expression)将计算表达式中的非空值,COUNT(column)将计算列中的所有非空值。

由于0和1都是非空值,COUNT(0)=COUNT(1)并且它们都等于行数COUNT(*)。这是一个不同的概念,但结果将是相同的。

答案 2 :(得分:16)

现在 - 他们都应该完全相同。

在过去的日子里,COUNT(1)(或您选择的任何常量)有时建议超过COUNT(*),因为糟糕的查询优化代码会使数据库在运行计数之前检索所有字段数据。因此COUNT(1)更快,但现在不应该重要。

答案 3 :(得分:1)

由于表达式1是一个常量表达式,因此它们应该始终产生相同的结果,但是实现可能有所不同,因为某些RDBMS可能会检查组中的每一行是否1 IS NULLThis is still being done by PostgreSQL 11.3 as I have shown in this article

我已经对100万行的基准查询进行了两种计数:

-- Faster
SELECT count(*) FROM t;

-- 10% slower on PostgreSQL 11.3
SELECT count(1) FROM t;

人们之所以会使用不太直观的COUNT(1)的一个原因可能是历史上的原因,反之亦然。

答案 4 :(得分:0)

COUNT(*), COUNT(1) , COUNT(0), COUNT('Y') , ...

以上所有内容均返回记录总数(包括空记录)。

但是COUNT('any constant')COUNT(*)快。

答案 5 :(得分:0)

假设我们有带有列的表

Table 
-------
col_A  col_B

查询时系统返回所有列(空值和非空值)

select col_A from Table

系统在查询时返回非空的列值

select count(col_A) from Table

查询时系统返回总行数

select count(*) from Table

答案 6 :(得分:0)

1)count(任何整数值)比count(*)快--->给出包括空值在内的所有计数

2)count(column_name)忽略null

Ex->

列名=> ID

values => 1 1 null null 2 2

==> count(0),count(1),count(*)----->结果仅为6

==> count(id)---->结果为4

答案 7 :(得分:0)

这是一个示例,您可以在count(<int>,<col>, or *)上看到不同之处:

create table test (title char(1),number int)

insert into test values ('A',0)
insert into test values ('B',1)
insert into test values ('C',2)
insert into test values (null,null)
insert into test values (null,3)
insert into test values ('D',null)

select count (0) from test       --> 6
select count (1) from test       --> 6
select count (title) from test   --> 4 (execludes nulls)
select count (number) from test  --> 4 (execludes nulls)
select count (*) from test       --> 6

从性能和内存角度来看,count(1)count(*)之间没有区别,它们都计算组中的记录数。

选中COUNT (Transact-SQL) - Remarks

答案 8 :(得分:-1)

结果将是相同的,但是COUNT(*)在当今的许多生产环境中速度较慢,因为在生产中,db引擎可以使用数十年。我更喜欢使用COUNT(0),有人使用COUNT(1),但绝对不会使用COUNT(*),即使它说可以安全地在现代数据库引擎上使用,我也不会依赖该引擎,尤其是如果它只有一个字符的差异,代码也将更易于移植。