当前位置: 首页 > news >正文

MySQL中count(1)和count(*) 的区别

MySQL中count(1)和count(*) 的区别

在 MySQL 中,COUNT(1)COUNT(*) 均用于统计查询结果中的行数,但它们在语义及其背后的机制上有一些区别。

基本功能

  • COUNT(*):统计表中所有行的数量,无论列是否为 NULL。

  • COUNT(1):统计所有行,这里的 1 是一个常数表达式,表示每一行都会被计数。

在大多数情况下,COUNT(*)COUNT(1) 的行为是完全一致的,它们都会返回表中的总行数。

区别

1. 语义和直观性
  • COUNT(*)

    • 语义上更清晰,表示“统计所有行”。

    • 对于不了解 SQL 的人来说,更容易理解。

  • COUNT(1)

    • 看起来像是针对某一个具体值的计数,但其实 1 是一个常量,它并不依赖于表中的任何列。

    • 可能会让一些人误以为它只统计某些符合条件的行(但实际上不是)。

2. 性能
  • 在大多数现代数据库管理系统的优化下,COUNT(*)COUNT(1) 的性能是相同的。

    • 数据库优化器通常会将两者视为等价的查询,并生成相同的执行计划。

    • 例如,在 MySQL 中,执行以下两个查询时,它们的执行计划(EXPLAIN)是相同的:

      EXPLAIN SELECT COUNT(*) FROM users;
      EXPLAIN SELECT COUNT(1) FROM users;
  • 但是,在某些极端情况下,可能会有一些微小的差别:

    • 例如,在某些存储引擎中(如 MyISAM),COUNT(*) 可能会直接读取存储的行数统计信息,而 COUNT(1) 也可能会利用同样的优化机制。

    • 如果表中存在大量数据,并且查询条件需要全表扫描,两者几乎没有性能差异。

3. 适用场景
  • COUNT(*)

    • 一般情况下,推荐使用 COUNT(*),因为它的语义更清晰,更容易让其他开发者理解查询的意图。

  • COUNT(1)

    • 在一些旧版本的数据库系统中,可能更倾向于使用 COUNT(1),但如今这种差异已经不明显。

    • 如果需要统计行数,但希望保持代码的一致性,可以使用 COUNT(1),尤其是在代码中已经大量使用这种形式的情况下。

示例

假设有一个表 users,包含以下数据:

idnameage
1Alice25
2Bob
3Carol30
  1. 查询:

    SELECT COUNT(*) FROM users;

    结果:3

  2. 查询:

    SELECT COUNT(1) FROM users;

    结果:3

注意

  • 如果使用 COUNT(column_name),则只会统计该列非 NULL 的行数。例如:

    SELECT COUNT(age) FROM users;

    结果:2(因为 Bobage 是 NULL)。

总结

  • 通常,COUNT(*)COUNT(1) 是等价的,区别主要在于语义和代码风格。

  • 推荐使用 COUNT(*),因为它更直观、语义明确。

相关文章:

  • docker的mysql容器修改数据库root的登录密码后,navicat依然能用旧密码访问
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 18
  • 超详细|25保研时间线及规划
  • IIS asp.net权限不足
  • 从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
  • Redis的持久化机制
  • 计算机考研之数据结构:深入解析最大公约数与欧几里得算法
  • .NET 9.0 的 Blazor Web App 项目中 EF Core 【事务】使用备忘
  • 第一章——1.1 Java程序设计平台
  • BIO、NIO 和 AIO 的区别?
  • k8s集群如何赋权普通用户仅管理指定命名空间资源
  • 快速排序_912. 排序数组(10中排序算法)
  • 基于 VScode 的 git 详细使用指南【保姆级!建议收藏!】
  • tcp连接的11种状态及常见问题。
  • Layui 列表中switch按钮的使用
  • 负载均衡 方式
  • 聚焦工控物联网网关
  • Vue3项目,蛋糕商城系统
  • 基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
  • 【mysql部署】在ubuntu22.04上安装和配置mysql教程
  • 经济日报:落实落细更加积极的财政政策
  • 五一假期上海境外来沪消费4.55亿元,同比增长211.6%
  • 竞彩湃|新科冠军利物浦留力?纽卡斯尔全力冲击欧冠
  • 给3亿老人爆改房子,是门好生意吗?
  • 巴菲特第60次股东大会开场点赞库克:他为伯克希尔赚的钱比我还多
  • 澳大利亚大选今日投票:聚焦生活成本与“特朗普问题”