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

Dhr*_*ruv 41 mysql sql

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

Bre*_*ren 51

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

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

select 1 from A
select 0 from A
select * from A
Run Code Online (Sandbox Code Playgroud)

将返回相同数量的记录,即表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)
Run Code Online (Sandbox Code Playgroud)

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

select count(Y) from A 
Run Code Online (Sandbox Code Playgroud)

由于只有一个非空值,因此输出为1

  • 那么为什么将整数值准确地传递给count函数呢? (2认同)

fth*_*lla 35

COUNT(*)将计算行数,同时COUNT(expression)将计算表达式中的非空值,并COUNT(column)计算列中的所有非空值.

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

  • @Yubaraj count(1)曾经有比count(*)更好的性能,至少在某些dbms上,但现在优化器能够使count(*)等于count(1) (4认同)

eft*_*trm 17

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

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


Luk*_*der 5

由于表达式1是一个常量表达式,它们应该总是产生相同的结果,但实现可能会有所不同,因为某些 RDBMS 可能会检查是否1 IS NULL针对组中的每一行。正如我在本文中所展示的,这仍然由 PostgreSQL 11.3 完成

我对 100 万行的查询进行了两种类型的计数:

-- Faster
SELECT count(*) FROM t;

-- 10% slower on PostgreSQL 11.3
SELECT count(1) FROM t;
Run Code Online (Sandbox Code Playgroud)

人们可能使用不那么直观的一个原因COUNT(1)可能是历史上,情况正好相反。