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

SQL聚合函数:SUM与COUNT的区别

在 SQL 中,SUMCOUNT(*)COUNT(1)COUNT(column) 都是聚合函数,但它们的作用和计算逻辑有本质区别:


1. SUM(column)

  • 作用:对指定列的所有非 NULL 数值求和。
  • 特性
    • 仅适用于数值类型列(如 INT, FLOAT 等)。
    • 忽略 NULL,仅计算有效数值。
  • 示例
    -- 假设表 sales 有列 amount: [100, NULL, 50]
    SELECT SUM(amount) FROM sales; -- 结果:150
    

2. COUNT(*)

  • 作用:统计表中总行数(包括所有列值为 NULL 的行)。
  • 特性
    • 不关心具体列内容,直接计数所有行。
    • 性能通常最优(数据库引擎会优化)。
  • 示例
    -- 假设表 sales 有 3 行(其中一行全为 NULL)
    SELECT COUNT(*) FROM sales; -- 结果:3
    

3. COUNT(1)

  • 作用:统计表中总行数(等价于 COUNT(*))。
  • 特性
    • 1 是一个常量表达式,不引用任何列。
    • 执行结果和性能与 COUNT(*) 完全相同(现代数据库优化后无差别)。
  • 示例
    SELECT COUNT(1) FROM sales; -- 结果:3(与 COUNT(*) 一致)
    

为什么 COUNT(*)COUNT(1) 一样?
数据库引擎在处理时,二者都会被优化为直接统计行数,无需检查列值。优先推荐 COUNT(*)(语义更明确)。


4. COUNT(column)

  • 作用:统计指定列中非 NULL 值的数量
  • 特性
    • 仅计数该列不为 NULL 的行。
    • 如果列包含 NULL,结果会小于 COUNT(*)
  • 示例
    -- 假设表 sales 有列 product: ["A", NULL, "B"]
    SELECT COUNT(product) FROM sales; -- 结果:2(忽略 NULL)
    

⭐ 关键区别总结

函数作用是否忽略 NULL性能建议
SUM(column)对数值列求和忽略 NULL 值仅用于数值列
COUNT(*)统计所有行数不忽略 NULL 行✅ 优先使用
COUNT(1)统计所有行数(同 COUNT(*)不忽略 NULL 行= COUNT(*)
COUNT(column)统计列的非 NULL 值数量忽略 NULL 值需注意 NULL 影响

🚨 常见误区

  1. COUNT(*) vs COUNT(1)

    • 二者性能无差异,但 COUNT(*) 更符合语义(统计行数)。
  2. COUNT(column) 可能返回比预期小的值

    • 如果列包含 NULL,结果会减少,例如:
      -- 表中 100 行,其中 10 行 column_x 为 NULL
      COUNT(*)      --> 100
      COUNT(column_x) --> 90
      
  3. COUNT 与字符串/日期列

    • COUNT(column) 可用于任何数据类型(不限于数字),但仍会忽略 NULL

💡 使用建议

  • 统计总行数 → COUNT(*)
  • 统计某列有效值数量 → COUNT(column)(注意 NULL 影响)
  • 避免 COUNT(非索引列) 对大表扫描,可考虑用索引列替代优化性能。
http://www.dtcms.com/a/320533.html

相关文章:

  • 解锁Java开发新姿势:飞算JavaAI深度探秘 #飞算JavaAl炫技赛 #Java开发
  • 力扣-53.最大子数组和
  • Java基础知识总结
  • 文件管理从基础到高级:文件描述符、超大文件切片重组与快速删除实战
  • Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)
  • Harbor 企业级实战:单机快速上手 × 高可用架构搭建 × HTTPS安全加固
  • 音视频直播全链路技术手册:核心术语与实战应用解析
  • Flink的窗口
  • LangChain4j终极指南:Spring Boot构建企业级Agent框架
  • 双目标定中旋转矩阵参数应用及旋转角度计算(聚焦坐标系平行)
  • 三方相机问题分析七:【datespace导致GPU异常】facebook 黑块和Instagram花图问题
  • Linux Shell:Nano 编辑器备忘
  • 以下是使用这款ePub编辑器将指定章节转换为TXT文本文档的操作方法
  • (数据结构)链表
  • Android 安全编程:Kotlin 如何从语言层保障安全性
  • Kotlin反射
  • HarmonyOS SDK助力讯飞听见App能力建设
  • 高德地图地理编码 逆地理编码全解析:地址和坐标的双向转换实战
  • HarmonyOS 设备自动发现与连接全攻略:从原理到可运行 Demo
  • 深入理解 robots.txt:网站与搜索引擎的 “沟通协议”
  • DataFun联合开源AllData社区和开源Gravitino社区将在8月9日相聚数据治理峰会论坛
  • 控制建模matlab练习12:线性状态反馈控制器-①系统建模
  • Ideogram:优秀的在线AI绘画平台
  • 人工智能基础知识笔记十五:文本分块(Chunk)
  • 芯伯乐XBL6019 60V/5A DC-DC升压芯片的优质选择
  • 新手向:Python实现图片转ASCII艺术
  • Custom SRP - Directional Shadows
  • 【0基础3ds Max】主工具栏介绍(上)
  • 论文reading学习记录7 - daily - ViP3D
  • 3D TOF 视觉相机:工业视觉的破局者,重塑视觉感知的未来