我最近在一次采访中被问到这个问题。我在 mySQL 中尝试了这个,并得到了相同的结果(最终结果)。All 给出了该特定表中的行数。谁能解释它们之间的主要区别。
9 回答
没什么,除非您在表中指定字段或括号中的表达式而不是常量值或 *
让我给你一个详细的答案。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 作为输出
COUNT(*)
将计算行数,同时COUNT(expression)
将计算表达式中的非空值并COUNT(column)
计算列中的所有非空值。
由于 0 和 1 都是非空值,COUNT(0)=COUNT(1)
它们都将等同于行数COUNT(*)
。这是一个不同的概念,但结果将是相同的。
现在 - 它们都应该执行相同的操作。
然而,在过去的日子里,有时建议使用 COUNT(1)(或您选择的任何常量)而不是 COUNT(*),因为糟糕的查询优化代码会使数据库在运行计数之前检索所有字段数据。因此 COUNT(1) 更快,但现在应该不重要了。
由于表达式1
是一个常量表达式,它们应该总是产生相同的结果,但是实现可能会有所不同,因为某些 RDBMS 可能会检查是否1 IS NULL
针对组中的每一行。正如我在本文中所展示的,这仍然由 PostgreSQL 11.3 完成。
我已经对 1M 行的查询进行了基准测试,执行了两种类型的计数:
-- Faster
SELECT count(*) FROM t;
-- 10% slower on PostgreSQL 11.3
SELECT count(1) FROM t;
人们可能会使用不太直观的一个原因COUNT(1)
可能是从历史上看,情况恰恰相反。
结果将是相同的,但是COUNT(*)
在当今的许多生产环境中速度较慢,因为在生产中,数据库引擎可以使用数十年。我更喜欢使用COUNT(0)
,有人使用COUNT(1)
,但绝对不是,COUNT(*)
即使它可以在现代数据库引擎上安全使用,我也不会依赖引擎,特别是如果它只有一个字符差异,代码也会更便携。
count(any integer value) 比 count(*) 快 ---> 给出包括空值在内的所有计数
count(column_name) 省略 null
前-->
列名=> id
值 => 1 1 null null 2 2
==> count(0), count(1), count(*) -----> 结果只有 6
==> count(id) ----> 结果是 4
假设我们有带有列的表
Table
-------
col_A col_B
查询时系统返回所有列(空和非空)值
select col_A from Table
查询时系统返回非空的列值
select count(col_A) from Table
查询时系统返回总行数
select count(*) from Table
mysql5.6
InnoDB 以相同的方式处理 SELECT COUNT(*) 和 SELECT COUNT(1) 操作。没有性能差异。
在我找到许多不同的答案后,官方文档是最快的方法。
COUNT(*), COUNT(1) , COUNT(0), COUNT('Y') , ...
以上所有都返回记录总数(包括空记录)。
但COUNT('any constant')
比COUNT(*)
.