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

SQL count(*)与 sum 区别

这是一个非常经典的SQL面试题。COUNT(*) 和 SUM() 是两个最常用的聚合函数,但它们的用途和计算方式有本质的区别。


简单来说,最核心的区别是:

  • COUNT(*) 统计的是行的数量。

  • SUM(column) 统计的是某列具体数值的总和。

下面我们通过一个详细的对比和例子来彻底搞清楚。


核心区别对比表

特性COUNT(*)SUM(column)
计算对象 (不管行里的内容是什么) (列中具体的数值)
返回值一个整数,表示满足条件的记录总数。一个数值,表示指定列所有值的总和。
对 NULL 的处理忽略 NULLCOUNT(*) 甚至对全是 NULL 的行也会计数,因为它数的是行。COUNT(column) 会忽略该列中为 NULL 的行。忽略 NULL。如果某行的该列值为 NULL,这行不会被加入总和。
常用场景统计总用户数、总订单数、总记录数。计算总销售额、总分数、总库存量。

举例说明

假设我们有一个 sales 表,记录了销售数据:

order_idproductquantityprice
1Apple52.5
2Banana101.2
3OrangeNULL3.0
4Mango84.5
5NULL2NULL

现在我们来执行不同的查询:

1. 使用 COUNT(*)
SELECT COUNT(*) AS total_orders FROM sales;

结果: 5
解释: 统计的是表中有多少行记录,共5行。它不关心任何列的具体值,即使整行都是 NULL(如第5行)也会被计数。

2. 使用 COUNT(column)
SELECT COUNT(product) AS product_count FROM sales;

结果: 4
解释: 统计 product 列中非 NULL 值的数量。第5行的 product 是 NULL,所以被忽略。

SELECT COUNT(quantity) AS quantity_count FROM sales;

结果: 4
解释: 统计 quantity 列中非 NULL 值的数量。第3行的 quantity 是 NULL,所以被忽略。

3. 使用 SUM(column)
SELECT SUM(quantity) AS total_quantity FROM sales;

结果: 25 (即 5 + 10 + 8 + 2)
解释: 计算 quantity 列所有非 NULL 值的总和。第3行的 NULL 被忽略,其他四行的值相加:5 + 10 + 8 + 2 = 25。

SELECT SUM(price) AS total_revenue FROM sales;

结果: 11.2 (即 2.5 + 1.2 + 3.0 + 4.5)
解释: 计算 price 列所有非 NULL 值的总和。第5行的 NULL 被忽略,其他四行的值相加。


一个综合查询展示所有区别

SELECTCOUNT(*) AS total_rows,COUNT(product) AS non_null_products,COUNT(quantity) AS non_null_quantities,SUM(quantity) AS total_quantity_sold,SUM(price) AS total_revenue
FROM sales;

结果:

total_rowsnon_null_productsnon_null_quantitiestotal_quantity_soldtotal_revenue
5442511.2

总结与记忆技巧

  • 数东西用 COUNT: 你想知道“有多少个?”(例如,有多少个订单?多少个用户?)就用 COUNT

  • 加数字用 SUM: 你想知道“总共是多少?”(例如,总共卖了多少钱?总共买了多少件?)就用 SUM

  • 牢记 NULL: 这两个函数在绝大多数数据库中都自动忽略 NULLCOUNT(*) 除外),这是最需要注意的一点,也常常是面试考点。

  • COUNT(1) 和 COUNT(*): 在功能上,COUNT(1) 和 COUNT(*) 没有区别,它们都是统计行数。COUNT(1) 中的 1 只是一个常量,表示对每一行都输出一个1,然后计算有多少个1。现代数据库优化器对它们的处理效率是一样的。

http://www.dtcms.com/a/341273.html

相关文章:

  • 【iOS】NSRunLoop
  • Preprocessing Model in MPC 2 - 背景、基础原语和Beaver三元组
  • 计算机网络--HTTP协议
  • Jenkins服务器配置SSH
  • 强制重启导致Ubuntu24.04LTS amd的WIFI无法使用的解决方案
  • 超长视频生成新突破!LongVie框架问世,创作不再受时长限制
  • spring第9课,spring对DAO的支持
  • C语言---编译的最小单位---令牌(Token)
  • 基于 Java 调用泛微 OA WebService 创建表单流程
  • 如何保障内部网络安全前提下,实现与外部互联网之间的文件传输?
  • 一种融合AI与OCR的施工许可证识别技术,提升工程监管效率,实现自动化、精准化处理。
  • 【CUDA编程】CUDA编程入门第一课
  • QT聊天项目DAY20
  • 【unitrix数间混合计算】3.3 无符号整数标记trait(bin_unsigned.rs)
  • C++:仿函数部分的补充、模版进阶(非类型模版参数、模板的特化、模板的分离编译)
  • 1277. 统计全为 1 的正方形子矩阵
  • 含钼溶液中回收钼
  • 【Windows】Windows平台基于加速地址安装vcpkg并集成到Visual Studio 2017
  • MySQL 50 道经典练习题及答案
  • 使用Jmeter轻松实现AES加密测试
  • 国电南自面试记录
  • 细说数仓中不同类型的维度
  • 实时交互世界模型新标杆! Skywork AI 发布 Matrix-Game 2.0: 攻克实时交互难题,在实时性与视频生成质量上实现跨越式突破!
  • synchronized锁,ReentrantLock 锁
  • 基于隐函数定理的偏导数计算及其C++实现
  • 批处理指令常见问题
  • 基于langchain重现agent调用llm和tools的过程
  • Angular入门教程
  • VG技术下,美术在资源制作时的规范
  • 前端 下载后端返回的二进制excel数据