SQL新手求教:两列直接相加与SUM(两列)的区别
嘿,作为SQL新手遇到这个问题太正常了——这俩写法本质上就是「逐行算账」和「总账汇总」的区别,我给你用例子讲明白:
核心区别:行级运算 vs 聚合运算
1. 两列直接相加:逐行计算,每行出一个结果
这种写法是针对表中的每一行,把这一行里的两个列值做加法,然后返回每一行的计算结果。返回的行数和原表完全一致,相当于给每行新增了一个“两列之和”的临时列。
举个实际例子,假设你有个订单表orders:
| order_id | 商品价格 | 税费 |
|---|---|---|
| 1 | 100 | 10 |
| 2 | 200 | 20 |
| 3 | 300 | 30 |
执行SELECT 商品价格 + 税费 FROM orders;,得到的结果是:
110 220 330
每一行都对应自己的“商品价+税费”,和原表的3行一一对应。
2. SUM()求和:聚合所有行,返回一个(或分组后的)总和
SUM()是SQL的聚合函数,它的作用是把某一列(或者一个计算表达式)的所有行的值加起来,最终返回一个单一的总和值(如果用GROUP BY分组的话,会返回每个分组的总和)。
还是用上面的订单表:
- 如果执行
SELECT SUM(商品价格 + 税费) FROM orders;,得到的结果是660——这是把所有行的“商品价+税费”加起来(110+220+330)的总账。 - 你也可以写成
SELECT SUM(商品价格) + SUM(税费) FROM orders;,结果也是660,因为先把所有商品价求和(100+200+300=600),所有税费求和(10+20+30=60),再把两个总和相加。
如果加上分组,比如按用户分组看每个用户的订单总金额:SELECT 用户ID, SUM(商品价格 + 税费) FROM orders GROUP BY 用户ID;
这时候会返回每个用户对应的订单总和,而不是全局的一个数,但本质还是聚合每个分组内的所有行。
一句话总结
- 直接列相加:给每行算小账,行数不变;
- SUM()求和:把所有小账加起来算总账,行数变成1行(或分组后的行数)。
内容的提问来源于stack exchange,提问作者Colin Landberg




