2013-08-17 352 views
24

我最近在一次采访中被问到了这个问题。 我在mySQL中试过了,得到了相同的结果(最终结果)。 All给出了该特定表中的行数。 任何人都可以解释他们之间的主要区别。mySQL/SQL中count(0),count(1)..和count(*)有什么区别?

+1

在列中有一个“null”值。然后在列上做点数。看看计数有何不同。选择'0'或'1'只是为每一行选择一个常量,不会涉及'null'。的 – Glenn

+0

可能重复[在SQL中,什么是计数(列)和计数(\ *)有何区别?(http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn - 计数) – newtover

回答

30

真的没什么,除非你指定表或字段或括号而非固定值内的表达式*

让我给你一个详细的解答。 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

那么为什么传递给计数函数的整数值呢? – Dhruv

+0

@DhruvSingh在回答中给了你更多细节 – Bren

+0

@Bren在性能方面有什么不同吗? –

20

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

由于0和1都是非空值,所以COUNT(0)=COUNT(1)和它们两者将相当于行数COUNT(*)。这是一个不同的概念,但结果是一样的。

+0

谢谢fthiella。 @brhneser对于像我这样的初学者有一个非常详细的答案。 – Dhruv

+1

是的,你说得对,但我认为'count(*)'会比'count(1)'花费更长的时间,不是吗?如果是,那么使用'count(1)'会更好的表现方式。 :) – Yubaraj

+3

@Yubaraj数(1)用于获得更好的性能比count(*),至少在某些DBMS,但现在的优化器能够使COUNT(*),相当于数(1) – fthiella

10

现在 - 他们都应该执行相同。

尽管如此,COUNT(1)(或您选择的任何常数)有时会推荐COUNT(*),因为较差的查询优化代码会使数据库在运行计数之前检索所有字段数据。 COUNT(1)因此速度更快,但现在无关紧要。

相关问题