Oracle 中的 SUM()COUNT() 函数详解

在 Oracle SQL 中,SUM()COUNT() 是最常见的聚合函数(Aggregate Functions)之一,广泛应用于数据汇总、报表统计和业务分析等场景。虽然这两个函数经常一起使用,但它们的作用、用法和注意事项却存在明显差异。

本文将系统介绍 SUM()COUNT() 的语法、功能差别、使用场景以及典型案例,帮助你在实际开发中灵活运用它们。


一、SUM() 函数 —— 数值求和

1. 基本语法

SUM(numeric_expression)

SUM() 用于对数值列中的值进行求和操作,忽略其中的 NULL 值。

2. 示例:计算部门总工资

SELECT deptno, SUM(sal) AS total_salary
FROM emp
GROUP BY deptno;

说明:统计每个部门的工资总额,结果中不会包含工资为 NULL 的行。


二、COUNT() 函数 —— 计数统计

1. 基本语法

-- 统计所有行(包括 NULL)
COUNT(*)

-- 统计某列非 NULL 的行数
COUNT(column_name)

-- 统计某列中唯一的非 NULL 值数量
COUNT(DISTINCT column_name)

2. 示例:统计各部门员工人数

SELECT deptno, COUNT(*) AS emp_count
FROM emp
GROUP BY deptno;

说明COUNT(*) 统计所有行,不管某些列是否为 NULL


三、NULL 值处理的不同

示例数据:

EMPNOENAMESALCOMM
7369SMITH800NULL
7499ALLEN1600300
7521WARD1250500
7566JONES2975NULL

比较:

SELECT SUM(comm), COUNT(comm), COUNT(*) FROM emp;
SUM(COMM)COUNT(COMM)COUNT(*)
80024
  • SUM(comm) 忽略 NULL,仅加总 300 + 500;
  • COUNT(comm) 忽略 NULL,仅统计两条非空记录;
  • COUNT(*) 统计全部行(包括 comm 为 NULL 的行)。

四、联合使用的典型示例

SELECT deptno,
       COUNT(*) AS emp_count,
       SUM(sal) AS total_salary,
       ROUND(SUM(sal)/COUNT(*), 2) AS avg_salary
FROM emp
GROUP BY deptno;

说明:该语句统计每个部门的员工人数、工资总额和平均工资,常用于生成部门报表。


五、SUM()COUNT() 对比总结

项目SUM()COUNT()
功能对数值列求总和对行或列进行计数
忽略 NULL 吗?COUNT(*) 否,COUNT(column)
应用于数据类型只能用于数值列可用于任意列
是否可分组使用
常见用途销售额、工资等数值统计行数统计、非空值统计、唯一值统计等

六、实战推荐使用方式

场景推荐函数
统计所有员工数量COUNT(*)
统计工资不为 NULL 的员工数COUNT(sal)
统计所有工资总额SUM(sal)
统计发放了奖金的员工数COUNT(comm)
统计奖金总额SUM(comm)
统计不同职位的个数COUNT(DISTINCT job)

七、常见误区提醒

  • SUM(NULL) 的结果是 NULL,而不是 0,因此要避免直接对全为 NULL 的列求和;
  • COUNT(*) 包含所有记录,不管列是否为 NULL;
  • 求平均数时使用 AVG() 更直接,但 SUM() / COUNT() 可以提供更细粒度的控制(例如仅对部分列进行分母统计);

八、结语

SUM()COUNT() 是 Oracle SQL 中不可或缺的聚合工具。它们在数据统计与业务分析中扮演着核心角色。掌握它们之间的区别和使用技巧,不仅能写出高效的 SQL 查询,还能在面对复杂数据处理需求时游刃有余。