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 ...
随机推荐
- Elasticsearch性能优化干货
1.集群规划优化实践 1.1 基于目标数据量规划集群 在业务初期,经常被问到的问题,要几个节点的集群,内存.CPU要多大,要不要SSD? 最主要的考虑点是:你的目标存储数据量是多大?可以针对目标数据量 ...
- Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
最近DeepSeek开源了对openai-o1的第一代开源推理大模型:deepseek-r1,因其极低的成本和与openai-o1相当的性能引发了国内外的激烈讨论.DD在做独立产品的时候也一直都有用D ...
- 从一指禅到无重复字符:最长子串问题的优雅解法|LeetCode 3 无重复字符的最长子串
LeetCode 3 无重复字符的最长子串 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你是否玩过"一指禅"游戏?就是沿 ...
- 开源标杆!天翼云TeleDB入选《2024央国企开源项目典型实践》!
近日,由中国通信标准化协会主办.中国信通院承办的2024 OSCAR开源产业大会在北京召开,会上发布<2024央国企开源项目典型实践>,天翼云科技有限公司打造的"TeleDB分布 ...
- Luogu P11363 NOIP2024 树的遍历 题解 [ 紫 ] [ 树形 dp ] [ 组合计数 ] [ adhoc ]
树上遍历:CCF 难得一遇的好题! 参考了洛谷的第一篇题解,所以思路会有点相似. 部分分 当 \(k=1\) 时,显然方案总数为 \(\prod_{i=1}^{n}(d_i-1)!\),因为进入一个子 ...
- Luogu P4310 绝世好题 题解 [ 绿 ] [ 线性 dp ] [ 单调队列优化 ] [ 二进制优化 ]
题目:绝世好题. 暴力 dp 显然 \(O(n^2)\) 转移即可. 单调队列优化 观察到只有某二进制位两个数都为 \(1\) 时才能转移,因此我们把每个二进制位开一个单调队列,然后对于一个数 \(a ...
- win10安装MongoDB 5.0
1.首先去官网下载安装包:https://www.mongodb.com/try?tck=docs_navbar 2.安装过程一路下一步就行,选择complete安装,可以勾选安装Compass工具 ...
- redis - [07] 数据类型
redis是一个开源(BSD许可)的,内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件MQ.它支持多种类型的数据结构,如字符串(String).散列(Hash).列表(List).集合( ...
- SparkRDD算子初识
Spark 的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD)之上的,这使得 Spark 的各个组件可以无缝地进行集成,能够在同一个应用 ...
- vue生命周期调用
<template> <div> <!-- 用户页的面包屑导航 --> <nav aria-label="breadcrumb"> ...