【mysql】count(*),count(1)与count(column)区别

转自: https://www.cnblogs.com/CareySon/p/DifferenceBetweenCountStarAndCount1.html
在SQL Server中Count()或者Count(1)或者Count(column)或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述着三者的作用,关系以及背后的原理。
往常我经常会看到一些所谓的优化建议不使用Count(
)而是使用Count(1),从而可以提升性能,给出的理由是Count()会带来全表扫描。而实际上如何写Count并没有区别。
Count(1)和Count(
)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。

DECLARE @xx INT
SET @xx=NULL
SELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]

代码清单1.Count中指定NULL
由于所有行都为NULL,则结果全不计数为0,结果如图1所示。
在这里插入图片描述
图1.显而易见,结果为0
因此当你指定Count(*) 或者Count(1)或者无论Count(‘anything’)时结果都会一样,因为这些值都不为NULL,如图2所示。
在这里插入图片描述
图2.只要在Count中指定非NULL表达式,结果没有任何区别

那Count列呢?
对于Count(列)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

那Count(*)具体如何执行?
前面提到Count( )有不为NULL的值时,在SQL Server中只需要找出具体表中不为NULL的行数即可,也就是所有行(如果一行值全为NULL则该行相当于不存在)。那么最简单的执行办法是找一列NOT NULL的列,如果该列有索引,则使用该索引,当然,为了性能,SQL Server会选择最窄的索引以减少IO。
我们在Adventureworks2012示例数据库的[Person].[Address]表上删除所有的非聚集索引,在ModifyDate这个数据类型为DateTime的列上建立索引,我们看执行计划,如图3所示:
在这里插入图片描述
图3.使用了CreateDate的索引
我们继续在StateProvinceID列上建立索引,该列为INT列,占4字节,相比之前8字节 DateTime类型的列更短,因此SQL Server选择了StateProvinceID索引。如图4所示。

在这里插入图片描述
图4.选择了更短的StateProvinceID索引

因此,如果某个表上Count(*)用的比较多时,考虑在一个最短的列建立一个单列索引,会极大的提升性能。

<think>嗯,用户问的是不同计数函数或方法的区别,特别是countcount1count0这些函数。首先,我需要确认用户指的是哪些编程语言或工具中的函数,因为不同环境下可能有不同的实现。不过根据提供的引用资料,用户提到了MySQLSQL、PostgreSQL和Matlab中的count函数,所以可能他们关注的是数据库和Matlab中的计数方法。 首先,我需要回顾一下数据库中的count函数。引用1提到MySQLcount函数,除了count(1)count(*),其他用法不会考虑NULL值。引用2详细说明了SQLcount(*)count(1)count(column)区别,而引用3则比较了PostgreSQL中的这些用法。同时,引用4介绍了Matlab中的Count函数,用于统计满足条件的元素个数。 用户提到的count0可能不是标准的函数名称,需要推测其含义。可能是指count(0)或者某种特定环境下的函数,比如Matlab中的用法?或者是用户混淆了不同术语? 接下来,我需要整理这些资料中的信息,区分不同环境下的计数函数。在SQL中,count(*)count(1)效果相同,都是统计所有行数,包括NULL值,而count(column)则忽略该列为NULL的行。而Matlab中的Count函数则是处理数组或矩阵中满足条件的元素数量,可能参数和用法不同。 用户可能混淆了不同编程环境中的函数,比如count1在数据库中可能是指count(1),而在其他语言中可能有不同含义。此外,用户提到的count0可能不存在于标准函数中,需要解释可能的情况,比如count(0)在数据库中的行为,或者是在其他编程语言中的自定义函数。 需要确保回答中覆盖不同环境下的count函数区别,明确count(*)count(1)count(列名)SQL中的差异,以及Matlab中的Count函数。同时,对于count0,可能需要指出它可能不是标准函数,或者在某些上下文中的特殊用法,例如count(0)在数据库中可能等同于count(1)count(*),但需要验证这一点。 另外,注意用户提供的引用中,PostgreSQL的引用提到count(*)count(1)效果相同,但count(1)会有额外的计算步骤,可能在性能上有细微差别,但通常可以忽略。需要将这一点纳入回答。 最后,要生成相关问题,确保问题覆盖不同数据库、编程语言以及优化和应用场景,帮助用户进一步学习。</think>### 不同计数函数或方法的区别 在编程和数据库查询中,常见的计数函数如 `count(*)`、`count(1)`、`count(列名)` 等,其行为差异主要执行逻辑和底层优化相关。以下分环境说明: --- #### **1. 数据库中的 `count` 函数** - **`count(*)`** 统计表中所有行的数量,**包括所有列值为 `NULL` 的行**。例如,即使某一行所有字段均为 `NULL`,`count(*)` 仍会将其计入统计[^1][^2][^3]。 - **`count(1)`** 功能 `count(*)` 相同,但实现细节略有差异。数据库会将 `1` 视为常量表达式,逐行判断并统计。理论上性能 `count(*)` 接近,但某些数据库(如 PostgreSQL)中可能多一步计算步骤[^3]。 - **`count(列名)`** 仅统计该列**非 `NULL` 值的行数**。例如,若某行该列值为 `NULL`,则不会被计入[^2]。 --- #### **2. Matlab 中的 `count` 函数** Matlab 的 `count` 用于统计数组或矩阵中**满足特定条件的元素个数**,例如: ```matlab A = [1, 0, 3; 0, 5, 0]; count = sum(A > 0, 'all'); % 统计大于0的元素数量 ``` 此处 `count` 的结果为 `3`(元素 1、3、5)[^4]。 --- #### **3. 其他场景中的 `count0`** `count0` 并非标准函数名,可能是以下两种情况之一: 1. **自定义函数**:如统计数组中值为 `0` 的元素数量,需自行实现逻辑。 2. **误写或混淆**:可能指 `count(0)`,在数据库中 `count(1)` 行为一致(统计所有行)。 --- ### 性能应用建议 - **数据库场景**:优先使用 `count(*)`,因其语义明确且多数数据库已优化其性能。 - **忽略 `NULL` 时**:使用 `count(列名)`,如统计有效订单数[^2]。 - **Matlab 场景**:结合条件表达式灵活统计元素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值