SQL中COUNT(*)与COUNT(字段)有什么区别

千伟吖_7955

千伟吖_7955

2026-08-07

679人浏览

原创

count(*)统计行数,count(字段)仅统计该字段非null值;前者反映结果集行数,后者反映当前结果集中该字段非空数量,语义随where/group by/join变化而漂移。

sql中count(*)与count(字段)有什么区别

COUNT(*) 统计的是行,COUNT(字段) 统计的是非NULL值

这是最根本的区别,不是bug,是SQL标准强制语义。COUNT(*)数的是结果集里有多少行,哪怕所有字段都是NULL,这行也计入;而COUNT(email)只看email这一列——只要该列值为NULL,整行就被跳过。

常见现象:COUNT(*)返回100,COUNT(email)返回92,说明有8行email是NULL。注意:''(空字符串)、0、false全算非NULL,只有数据库层面真正的NULL被排除。

  • 差值直接等于该列NULL数量,比查表结构或翻文档更快更准
  • WHERE和GROUP BY之后才做NULL判断,所以COUNT(字段)反映的是当前结果集里的分布,不是原始表

LEFT JOIN后用COUNT(字段)极易误判主表基数

在LEFT JOIN users u ON u.id = o.user_id这类查询中,对右表字段如o.order_id用COUNT(o.order_id),统计的是“成功关联的订单行数”,不是“用户数”。1个用户有3个订单,JOIN后变成3行,COUNT(o.order_id)就返回3。

如果右表外键字段本身允许NULL(比如没加NOT NULL约束),COUNT(o.user_id)还会剔除user_id IS NULL的行——结果既不是用户数,也不是订单总数,语义完全错位。

绘蛙AI抠图
绘蛙AI抠图

绘蛙AI抠图是一款AI图片处理工具,绘蛙推出的 AI 智能抠图工具。

下载
  • 想统计左表原始行数,应写COUNT(DISTINCT u.id)
  • 想统计右表匹配行数,且右表字段已定义NOT NULL,COUNT(o.id)才安全
  • 用COUNT(*)配合GROUP BY u.id可清晰区分每组行数

COUNT(*)性能通常优于COUNT(字段),尤其字段无索引或NULL比例高时

COUNT(*)只需确认行存在性,优化器常走最小索引(如主键)甚至元数据估算;COUNT(email)必须读取email列值并逐行判空,尤其当该列允许NULL且无索引时,大概率触发全表扫描。

这些隐式开销比函数写法本身影响更大:

  • 字段未加NOT NULL约束
  • 该列没有索引
  • 表中NULL占比高(比如日志表里error_code只在出错时有值)
  • 即使id是主键,只要它允许NULL,COUNT(id)仍要判空,无法完全跳过回表

COUNT(*)和COUNT(1)在主流引擎中性能几乎一致,别为“看起来快”改写

MySQL 8.0+、PostgreSQL、SQL Server等都会将COUNT(*)和COUNT(1)优化为相同执行计划。MySQL官方文档明确说二者处理方式完全相同。

MyISAM表对COUNT(*)有特殊缓存优化(直接读表头行数),而COUNT(1)不一定享受同等待遇;InnoDB虽无缓存,但从8.0.13起也对无条件COUNT(*)做了扫表路径优化。

  • 优先用COUNT(*):它是SQL92标准语法,语义最清晰,且现代优化器最熟悉它
  • COUNT(1)不是错误,但没必要刻意替换COUNT(*)
  • 阿里开发手册【强制】要求:不要用COUNT(列名)或COUNT(常量)替代COUNT(*)
真正容易被忽略的一点:你写的COUNT(字段),统计的从来不是“这张表里这个字段有多少非空”,而是“当前SELECT结果集里这个字段有多少非空”——中间可能经过了JOIN、WHERE、GROUP BY,语义已经漂移。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3823

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

989

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5641

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2603

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5600

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7381

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1010

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

872

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习