sum和count的区别
SQL 中的 SUM和 COUNT是两个最常用的聚合函数,但它们的计算目标和适用场景有本质区别。简单来说,COUNT用于“数个数”,而 SUM用于“算总和”。
下面这个表格能帮你更直观地看清它们之间的核心差异。
| 特性 | COUNT |
SUM |
|---|---|---|
| 核心功能 | 统计记录的数量或非NULL值的个数 | 计算指定列所有数值的总和 |
| 返回值 | 一个整数(行数或非NULL值数量) | 一个数值(总和),通常与列的数据类型一致(如整数、小数) |
| 对NULL的处理 | COUNT(*)统计所有行,不忽略NULL;COUNT(列名)仅统计该列非NULL值的数量 |
完全忽略NULL值,只对有效的数值进行相加 |
| 适用场景 | “有多少个?” - 例如:总用户数、总订单数 | “总共是多少?” - 例如:总销售额、总分数 |
| 适用数据类型 | 任何类型(COUNT(*)或 COUNT(1));任意类型(COUNT(列名),但只关心是否存在值) |
通常是数值类型(如 INT, DECIMAL, FLOAT) |
通过实例加深理解
假设有一张 sales销售表,数据如下:
| order_id | product | quantity | price |
|---|---|---|---|
| 1 | Apple | 5 | 2.5 |
| 2 | Banana | 10 | 1.2 |
| 3 | Orange | NULL | 3.0 |
| 4 | Mango | 8 | 4.5 |
| 5 | NULL | 2 | NULL |
不同的函数会得到不同的结果:
-
COUNT(*): 统计的是总行数,不关心任何列的具体值。SELECT COUNT(*) AS total_orders FROM sales;结果:5(因为表中共有5行记录)
-
COUNT(column): 统计特定列中非NULL值的数量。SELECT COUNT(product) AS product_count FROM sales;结果:4(因为
product列有1个NULL值,被忽略) -
SUM(column): 计算指定数值列中非NULL值的总和。SELECT SUM(quantity) AS total_quantity FROM sales;结果:25(计算过程为:5 + 10 + 8 + 2 = 25,第3行的NULL被忽略)
关于COUNT的几种常见写法
你可能会遇到 COUNT(*), COUNT(1), COUNT(列名)这几种形式,它们的区别在于:
-
**
COUNT(*)**和 **COUNT(1)**的功能完全相同,都是统计所有行的数量,包括全为NULL的行。在现代数据库中,它们的性能没有差异,通常推荐使用COUNT(*),因为其语义更明确(统计行数)。 -
**
COUNT(列名)**统计的是该列非NULL值的数量。如果该列存在NULL值,结果可能会小于COUNT(*)。
如何选择?
记住一个简单的原则:
-
当你想知道 “有多少个?”(例如,有多少个订单?多少个有效邮箱?)时,使用
COUNT。 -
当你想知道 “总共是多少?”(例如,总销售额是多少?总成本是多少?)时,使用
SUM。
