Oracle中SUM函数对常量求和时,结果取决于数据行数。
查询
select sum(0),sum(1),sum(10) from dual返回0,1,10(dual表只有1行);
而查询
select sum(0),sum(1),sum(10) from emp返回0,N,10×N(N为emp表行数)。
SUM函数会忽略NULL值,但常量求和时每行都有值,结果等于常量值乘以行数。
例如emp表14行时,sum(1)=14,sum(10)=140。
dual表因只有1行,结果就是常量本身。
Oracle
select sum(0),sum(1),sum(10)from dual;
select sum(0),sum(1),sum(10)from emp;
在 Oracle 中,这两个查询的结果不同 ,原因在于 SUM 函数会忽略 NULL 值。
1. 查询 select sum(0), sum(1), sum(10) from dual;
结果:
0, 1, 10
原因:
-
dual表只有 1 行数据。 -
对常量
0,1,10求和,就是它们自身。 -
没有
NULL行,所以结果就是这三个值。
2. 查询 select sum(0), sum(1), sum(10) from emp;
结果:
取决于 emp 表有多少行。假设有 14 行 (标准 scott 示例数据),结果为:
0, 14, 140
原因:
-
sum(0)= 0 × 行数 = 0 -
sum(1)= 1 × 行数 = 行数(这里是 14) -
sum(10)= 10 × 行数 = 10 × 14 = 140
关键点:如果 emp 表中某行在求和列上为 NULL,该行会被忽略
但这里 0, 1, 10 是常量 ,不是列,所以每一行都有这些值,不存在 NULL 的情况。
因此结果是 常量 × 行数。
演示对比(假设 emp 有 N 行):
| 查询源 | sum(0) | sum(1) | sum(10) |
|---|---|---|---|
| dual (1行) | 0 | 1 | 10 |
| emp (N行) | 0 | N | 10×N |
注意事项(如果对列求和)
如果你以后写类似 sum(col_name):
-
如果该列某行是
NULL,那一行不会参与求和。 -
但这里用的是常量,所以不存在 NULL 影响。
图示说明 sum(10) = 10 × 行数
假设 emp 表有 14 行数据,执行:
sql
select sum(10) from emp;
执行过程图示:
| 行号 | 常量值 | SUM 累加过程 |
|---|---|---|
| 1 | 10 | 0 + 10 = 10 |
| 2 | 10 | 10 + 10 = 20 |
| 3 | 10 | 20 + 10 = 30 |
| 4 | 10 | 30 + 10 = 40 |
| 5 | 10 | 40 + 10 = 50 |
| 6 | 10 | 50 + 10 = 60 |
| 7 | 10 | 60 + 10 = 70 |
| 8 | 10 | 70 + 10 = 80 |
| 9 | 10 | 80 + 10 = 90 |
| 10 | 10 | 90 + 10 = 100 |
| 11 | 10 | 100 + 10 = 110 |
| 12 | 10 | 110 + 10 = 120 |
| 13 | 10 | 120 + 10 = 130 |
| 14 | 10 | 130 + 10 = 140 |
数学公式:
text
sum(10) = 10 × 14 = 140
同理:
-
sum(0)= 0 × 14 = 0 -
sum(1)= 1 × 14 = 14 (这就是为什么sum(1)常用于统计行数)
对比 dual 表(只有 1 行):
text
sum(10) = 10 × 1 = 10