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. 性能对比

  1. COUNT(*)COUNT(1)

    • 性能上几乎无差别,因为都由 MySQL 优化为相同的行统计操作。
    • 优先使用 COUNT(*),更直观且语义明确。
  2. COUNT(字段名)

    • 会判断字段是否为 NULL,性能可能略低于 COUNT(*)COUNT(1)
    • 如果字段上有索引,性能会更优。

6. 总结

类型 是否统计 NULL 优化程度 使用场景
COUNT(*) 最高 统计表中总行数
COUNT(1) 统计表中总行数(与 COUNT(*) 等效)
COUNT(字段名) 中等(视索引而定) 统计字段非空值的行数

推荐:

  • 默认使用 COUNT(*),语义清晰且优化程度最高。
  • 如果需要统计字段的非空值数量,使用 COUNT(字段名)

MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?的更多相关文章

  1. 如何在MySQL中查询每个分组的前几名【转】

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...

  2. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

  3. 待续--mysql中key 、primary key 、unique key 与index区别

    mysql中key .primary key .unique key 与index区别

  4. 仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大

    仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大 1.介绍 先看图 ​ 今天在项目中遇到了一个问题,例如我现在需要传一些数据到后端,数组例如是 let arr = [ {" ...

  5. MySQL中redo log、undo log、binlog关系以及区别

    MySQL中redo log.undo log.binlog关系以及区别 本文转载自:MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结 ...

  6. 如何在mysql中查询每个分组的前几名

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等.  在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...

  7. mysql中key 、primary key 、unique key 与index区别

    一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...

  8. MYSQL中replace into的用法以及与inset into的区别

    在向表中插入数据时,我们经常会遇到这样的情况:1.首先判断数据是否存在:2.如果不存在,则插入:3.如果存在,则更新. 在SQL Server中可以这样处理: if not exists (selec ...

  9. DEDECMS中,文章页直接输出字段名

    文章页中,可直接输出字段名

  10. C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型

    如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...

随机推荐

  1. MySQL Event Scheduler were found damaged

    Navicat操作Mysql时报错信息:Cannot proceed because system tables used by Event Scheduler were found damaged ...

  2. Numa初识

    本文分享自天翼云开发者社区<Numa初识>,作者:j****n Numa产生 在二十世纪九十年代被开发出来的. 首次商业化实现基于NUMA的Unix系统的是对称多处理XPS-100系列服务 ...

  3. Linux 之 vi / vim

    vi / vim ​ Vim 是从 vi 发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了 ...

  4. Mac安装Zookeeper

    软件版本:3.4.10   一.软件下载 下载链接:http://archive.apache.org/dist/zookeeper/  解压缩:tar -zxf zookeeper-3.4.10.t ...

  5. mybatis之使用Map和模糊查询

    使用Map 接口类 package com.yeyue.dao; import com.yeyue.pojo.User; import java.util.List; import java.util ...

  6. RabbitMQ(五)——发布订阅模式

    RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...

  7. js 字符串“http%3A%2F%2F”转换成http://详解

    字符串"http%3A%2F%2F"转换成http://详解 我截获下来一个URL的字符串格式是"http%3A%2F%2F",但是实际应该是http:// 而 ...

  8. DeepSeek “源神”启动!「GitHub 热点速览」

    ​上周,DeepSeek 官方宣布将陆续发布 5 个开源项目.本周一开源社区就迎来了首发之作--FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升. Gi ...

  9. hbase - [03] 客户端常用命令(hbase shell)

    1.列出所有namespace list_namespace 2.创建namespace create_namespace 'ns_name' 3.修改namespace属性 alter_namesp ...

  10. DeepSeek 不太稳定?那就搭建自己的 DeepSeek 服务

    概述 DeepSeek-R1 发布 DeepSeek 在 2025 年给我们送来一份惊喜,1 月 20 号正式发布第一代推理大模型 DeepSeek-R1.这个模型在数学推理.代码生成和复杂问题解决等 ...