SQL count(*)与 sum 区别
这是一个非常经典的SQL面试题。COUNT(*)
和 SUM()
是两个最常用的聚合函数,但它们的用途和计算方式有本质的区别。
简单来说,最核心的区别是:
COUNT(*)
统计的是行的数量。SUM(column)
统计的是某列具体数值的总和。
下面我们通过一个详细的对比和例子来彻底搞清楚。
核心区别对比表
特性 | COUNT(*) | SUM(column) |
---|---|---|
计算对象 | 行 (不管行里的内容是什么) | 列 (列中具体的数值) |
返回值 | 一个整数,表示满足条件的记录总数。 | 一个数值,表示指定列所有值的总和。 |
对 NULL 的处理 | 忽略 NULL。COUNT(*) 甚至对全是 NULL 的行也会计数,因为它数的是行。COUNT(column) 会忽略该列中为 NULL 的行。 | 忽略 NULL。如果某行的该列值为 NULL,这行不会被加入总和。 |
常用场景 | 统计总用户数、总订单数、总记录数。 | 计算总销售额、总分数、总库存量。 |
举例说明
假设我们有一个 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 |
现在我们来执行不同的查询:
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_rows | non_null_products | non_null_quantities | total_quantity_sold | total_revenue |
---|---|---|---|---|
5 | 4 | 4 | 25 | 11.2 |
总结与记忆技巧
数东西用
COUNT
: 你想知道“有多少个?”(例如,有多少个订单?多少个用户?)就用COUNT
。加数字用
SUM
: 你想知道“总共是多少?”(例如,总共卖了多少钱?总共买了多少件?)就用SUM
。牢记 NULL: 这两个函数在绝大多数数据库中都自动忽略 NULL(
COUNT(*)
除外),这是最需要注意的一点,也常常是面试考点。COUNT(1)
和COUNT(*)
: 在功能上,COUNT(1)
和COUNT(*)
没有区别,它们都是统计行数。COUNT(1)
中的1
只是一个常量,表示对每一行都输出一个1,然后计算有多少个1。现代数据库优化器对它们的处理效率是一样的。