想象一下……你有一大串超市购物清单。你想知道最后到底花了多少钱。你肯定不会手动一项项加吧?其实收银员那边早就都在数据库里了。所以你拿到的结账小票金额肯定是对的。很可能,他们的应用里就有我们今天的主角——SUM() 函数!这是个聚合函数,可以把数字类型列里的值都加起来。
SUM() 的语法
SUM() 这个函数用起来跟它名字一样简单,不过我们还是来拆解一下:
SELECT SUM(列名)
FROM 表名;
这个函数会把指定列里的所有值都加起来。但说实话:它不会神奇地把文本或者日期加起来!只能加数字。
SUM() 的用法示例
我们先来看个简单例子。假设有个 salaries 表,存着员工的工资:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 55000 |
| 4 | 75000 |
示例 1:汇总所有工资
你想知道公司总共发了多少工资。这样写就行:
SELECT SUM(salary) AS total_salary
FROM salaries;
结果:
| total_salary |
|---|
| 240000 |
发生了什么? PostgreSQL 把 salary 列里的所有值(50000 + 60000 + 55000 + 75000)加起来,然后用 total_salary 这个新列名返回结果。
示例 2:带条件的汇总
比如你只想知道工资高于 55,000 的员工总工资。用我们最爱的 WHERE 操作符:
SELECT SUM(salary) AS high_salary_total
FROM salaries
WHERE salary > 55000;
结果:
| high_salary_total |
|---|
| 135000 |
这里发生了什么? PostgreSQL 先用 WHERE salary > 55000 过滤,只留下工资 60000 和 75000 的行,然后把这两个工资加起来(60000 + 75000)。
3. SUM() 的一些细节
NULL 会怎么影响 SUM()?就像我们看到的,NULL 就是“啥都没有”,SUM() 计算时会直接跳过它。来看个表:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | NULL |
| 4 | 75000 |
如果我们想查总工资:
SELECT SUM(salary) AS total_salary
FROM salaries;
结果:
| total_salary |
|---|
| 185000 |
为啥是“185000”,不是“NULL”? PostgreSQL 计算总和时直接无视 NULL。
复杂查询里的 SUM() 示例
示例 1:一条语句里汇总+过滤
假设有个 sales 表,存着销售数据。结构如下:
| product_id | amount |
|---|---|
| 1 | 150 |
| 2 | 200 |
| 3 | NULL |
| 1 | 100 |
你想查 product_id = 1 的 amount 总和:
SELECT SUM(amount) AS total_sales
FROM sales
WHERE product_id = 1;
结果:
| total_sales |
|---|
| 150 |
示例 2:总和加额外计算
还是用 salaries 表。你想知道工资总额比 200,000 多多少:
SELECT SUM(salary) - 200000 AS surplus
FROM salaries;
结果:
| surplus |
|---|
| 40000 |
用 SUM() 时常见的坑
对非数字数据用 SUM():如果你不小心对文本列用 SUM(),会报错。一定要确认你列的数据类型是数字。
忽略 NULL:新手经常忘了 NULL 不参与计算,这样可能会得到意外的结果。
GO TO FULL VERSION