MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
MySQL 中 count(*)、count(1) 和 count(字段名) 的区别
在 MySQL 中,COUNT() 函数用于统计记录数。虽然 COUNT(*)、COUNT(1) 和 COUNT(字段名) 的功能类似,但它们在执行逻辑和结果上有所不同。
1. count(*)
特点
- 统计表中所有行的数量,包括
NULL值。 - 执行时不会忽略任何行。
- 通常是统计总行数的首选方式,因为其优化程度最高。
执行原理
- MySQL 会将
COUNT(*)优化为统计行数操作,不需要额外读取数据内容。 - 引擎级别的优化使其性能优于
COUNT(字段名)。
适用场景
- 统计整个表的总行数时使用。
2. count(1)
特点
- 统计所有行的数量,同样包括
NULL值。 1只是一个常量,与表中的具体字段无关。
执行原理
- MySQL 会将
COUNT(1)优化为COUNT(*),执行时效果基本相同。 - 逻辑上是检查每行是否存在,判断为有效行后计数。
适用场景
- 与
COUNT(*)类似,但在语义上可以明确表示对行数的统计。
3. count(字段名)
特点
- 统计指定字段非空值的行数。
- 只会统计字段值不为
NULL的行。
执行原理
- 查询过程中会判断该字段是否为
NULL,只有非NULL的行才会被计数。 - 若字段上存在索引,则
COUNT(字段名)可直接通过索引计算,性能较好。
适用场景
- 当需要统计某字段非空值的数量时使用。
4. 示例
假设有一个 users 表,内容如下:
| id | name | age |
|---|---|---|
| 1 | Alice | 25 |
| 2 | Bob | NULL |
| 3 | NULL | 30 |
| 4 | Carol | NULL |
| 5 | NULL | 35 |
(1) COUNT(*)
SELECT COUNT(*) FROM users;
结果:
5
说明:统计所有行数,包括 NULL。
(2) COUNT(1)
SELECT COUNT(1) FROM users;
结果:
5
说明:统计所有行数,与 COUNT(*) 结果一致。
(3) COUNT(name)
SELECT COUNT(name) FROM users;
结果:
3
说明:统计 name 列中非 NULL 的值,结果为 3。
(4) COUNT(age)
SELECT COUNT(age) FROM users;
结果:
3
说明:统计 age 列中非 NULL 的值,结果为 3。
5. 性能对比
COUNT(*)和COUNT(1)- 性能上几乎无差别,因为都由 MySQL 优化为相同的行统计操作。
- 优先使用
COUNT(*),更直观且语义明确。
COUNT(字段名)- 会判断字段是否为
NULL,性能可能略低于COUNT(*)和COUNT(1)。 - 如果字段上有索引,性能会更优。
- 会判断字段是否为
6. 总结
| 类型 | 是否统计 NULL |
优化程度 | 使用场景 |
|---|---|---|---|
COUNT(*) |
是 | 最高 | 统计表中总行数 |
COUNT(1) |
是 | 高 | 统计表中总行数(与 COUNT(*) 等效) |
COUNT(字段名) |
否 | 中等(视索引而定) | 统计字段非空值的行数 |
推荐:
- 默认使用
COUNT(*),语义清晰且优化程度最高。 - 如果需要统计字段的非空值数量,使用
COUNT(字段名)。
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?的更多相关文章
- 如何在MySQL中查询每个分组的前几名【转】
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...
- 获取sqlserver数据库中所有库、表、字段名的方法
获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...
- 待续--mysql中key 、primary key 、unique key 与index区别
mysql中key .primary key .unique key 与index区别
- 仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大
仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大 1.介绍 先看图 今天在项目中遇到了一个问题,例如我现在需要传一些数据到后端,数组例如是 let arr = [ {" ...
- MySQL中redo log、undo log、binlog关系以及区别
MySQL中redo log.undo log.binlog关系以及区别 本文转载自:MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结 ...
- 如何在mysql中查询每个分组的前几名
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...
- mysql中key 、primary key 、unique key 与index区别
一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...
- MYSQL中replace into的用法以及与inset into的区别
在向表中插入数据时,我们经常会遇到这样的情况:1.首先判断数据是否存在:2.如果不存在,则插入:3.如果存在,则更新. 在SQL Server中可以这样处理: if not exists (selec ...
- DEDECMS中,文章页直接输出字段名
文章页中,可直接输出字段名
- C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型
如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...
随机推荐
- Quackerjack pg walkthrough
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.159.57 Starting Nmap 7.94SVN ( https://nmap.org ) at ...
- H5调用手机拨打电话的功能
里面加上: 我没有写也是可以的 <meta name="format-detection" content="telephone=yes"/> 该标 ...
- 免费的天气接口api(腾讯)
请求URL: https://wis.qq.com/weather/common请求方式: GET参数: 参数名 必选 类型 说明 source 是 string pc weather_type 是 ...
- 旁站和C段查询
旁站和C段查询 旁站和C段的概念 旁站 旁站(也称为邻居站点)是指与目标网站在同一服务器上的其他网站.这些网站与目标网站共享相同的网络环境,包括IP地址(或更具体地说,共享相同的C段IP地址,但D段不 ...
- Project Euler 307 题解
主要是规避误差.即求 \[\frac{k^n}{n^k} \] 微分一下得到递推式.然后根据斯特林近似(byd 这里还需要 \(1\) 后的第一项..) ...
- 一个SQL就让内存耗光了
一个SQL内存为什么就没了呢 最近遇到一个故障,研发新上线一个功能,成功把主机内存耗光,导致实例重启.复现一个SQL如何把数据库的内存耗光. 实验环境 Oracle Database 19c(故障发生 ...
- 在Android源码中为APK编译系统权限
系统权限获取 打包为APK进行系统签名 对于 部分功能的访问需要使用到系统权限,需要 添加 android:sharedUserId="android.uid.system" 权限 ...
- 写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用
插件正在提交,应该过几天就会进入市场了. 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试. 使用 插件会提供一个二维码,使用OpenIoThub ...
- 深入理解C++ 空类大小
在C++中,规定空类(即类中没有任何数据成员.成员函数.虚函数等成员的类)的大小为1字节,这背后主要有以下几方面的原因: 保证对象的唯一性和可区分性 在C++的面向对象编程模型中,对象是类的实例化结果 ...
- 近1000 star,Forest 1.5.0 正式版发布
简介 Forest是一个高层的.极简的轻量级HTTP调用API框架. 相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求. 不需要调用HTTP底层 ...