Oracle:select sum(0),sum(1),sum(10)from emp;

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
相关推荐
bcbobo21cn1 年前
在一个sql select中作多个sum并分组
数据库·sql·sum·group by
bcbobo21cn1 年前
sql group by 多个字段例子
数据库·sql·sum·group by
bug菌¹2 年前
滚雪球学MySQL[3.2讲]:MySQL聚合函数与分组详解:COUNT、SUM、AVG、MAX、MIN及GROUP BY与HAVING
数据库·mysql·max·sum·count·min·avg
Chensay.2 年前
Excel常用函数大全
excel·sum·函数
bcbobo21cn3 年前
excel单元格各种组合求和
excel·sum·单元格引用
von Neumann3 年前
深入浅出Pytorch函数——torch.sum
人工智能·pytorch·深度学习·sum·求和