您的位置:

count(1)与count(*)的区别详解

一、count(1)和count(*)的区别

在使用count函数计算某表中的数据行数时,通常有两种方法,即使用count(1)和count(*)。这两种方法在结果上没有区别,但是在内部计算的方式上存在一定差异。

使用count(1)会统计符合条件的记录中任意一列的值,因此在计算过程中不需要去检查记录中的列是否为 null,而使用count(*)则会统计所有记录,包括存在null值,因此在计算过程中需要检查记录中的每一列是否为null。

SELECT COUNT(1) FROM table_name;
SELECT COUNT(*) FROM table_name;

二、count和count(1)的区别

除了count(*)和count(1)之外,还可以使用count(column_name)来计算某一列的不同值的个数。这种情况下,count(column_name)和count(1)的结果是一致的,但是count(column_name)会按照列值进行统计,会去掉null值。

SELECT COUNT(column_name) FROM table_name;
SELECT COUNT(1) FROM table_name;

三、count(1)和count主键的区别

许多表在创建时都会加上一个主键,主键的值都是唯一的。如果使用count(1)或count(*)来统计数据行数,那么返回的结果就是主键的数量,因为主键是非空的,不需要检查是否为null。但是,如果使用count(主键名称)来统计数据行数,那么返回的结果就是实际记录的数量,因为主键中也有可能存在null值。

SELECT COUNT(1) FROM table_name;
SELECT COUNT(*) FROM table_name;
SELECT COUNT(primary_key) FROM table_name;

四、count(1)和count(*)的性能

在大多数情况下,使用count(1)和count(*)没有明显的性能差距。但是,当统计的数据量较大时,count(*)的性能稍微上一些,因为count(1)需要统计某一列的值,会多做一些无用的计算。但是,优化器会在情况允许的情况下自动选择更高效的计算方法,所以在实际使用中,两种统计方法的性能差距并不明显。

五、count(*)和count(1)的区别

当表中不存在任何记录时,使用count(1)和count(*)返回的结果都是0。但是,在表中存在一些记录但是这些记录的值为null时,两种统计方法的结果还是有所不同的。使用count(*)会将null值也统计在内,而使用count(1)则不统计null值。

SELECT COUNT(1) FROM table_name WHERE column_name IS NULL;
SELECT COUNT(*) FROM table_name WHERE column_name IS NULL;

六、count*、count(1)和count(column)字段

无论是count(*)、count(1)还是count(column),返回的结果都是标量值,而不是查询结果集。有时候,我们需要根据统计结果来返回实际的查询结果集。我们可以使用以下方法来实现:

SELECT column1, column2, ..., columnN, COUNT(1) AS cnt FROM table_name WHERE condition GROUP BY column1, column2, ..., columnN ORDER BY cnt DESC;

七、count(0)和count的区别

使用count(0)和count没有明显的区别,因为0不会出现在实际的记录中,因此使用count(0)和count(*)效果相同,但是在一些数据库系统中,有些优化器会将count(0)转化为count(*)来执行,因此在这些数据库中,使用count(0)和count(*)效果相同。

SELECT COUNT(0) FROM table_name;
SELECT COUNT(*) FROM table_name;

八、count和counta的区别

在一些数据库中,例如Microsoft Access中,count和counta是不同的函数。counta函数返回的是非空值的个数,而count函数返回的是所有值的个数。在大部分数据库中,这两个函数是等效的,都返回符合条件的记录的个数。

--MySQL中这两个函数等效
SELECT COUNT(column_name) FROM table_name;
SELECT COUNTA(column_name) FROM table_name;

--Access中这两个函数不等效
SELECT COUNT(column_name) FROM table_name;
SELECT COUNTA(column_name) FROM table_name;