← 目录从入门到精通SQL Server

聚合函数

2024/10/19

SQL Server 聚合函数详解:COUNT、SUM、AVG、MIN、MAX 以及 GROUP BY 和 HAVING 子句

在 SQL Server 中,聚合函数是进行数据分析和总结的重要工具,能够帮助我们对一组数据执行计算操作,例如计数、求和、计算平均值等。与此同时,GROUP BY 和 HAVING 子句使我们能够按特定列对数据进行分组和过滤。本篇博客将详细介绍 COUNT、SUM、AVG、MIN、MAX 等聚合函数的使用,结合 GROUP BY 和 HAVING,并提供丰富的示例代码。


1. 聚合函数的介绍

聚合函数用于对一组值执行计算,并返回单个结果。这些函数主要用于汇总数据,常用于报表和统计查询。SQL Server 支持以下常见的聚合函数:

  • COUNT:计算记录的数量
  • SUM:计算数值列的总和
  • AVG:计算数值列的平均值
  • MIN:获取列中的最小值
  • MAX:获取列中的最大值

1.1 COUNT:计算记录数量

COUNT 函数用于返回某列的记录数,它可以用来统计表中的记录数或非 NULL 值的数量。

语法:

sql
SELECT COUNT(列名) 
FROM 表名;

示例:

统计公司员工总数:

sql
SELECT COUNT(EmployeeID) AS TotalEmployees
FROM Employees;

这条查询会返回 Employees 表中 EmployeeID 列的非空记录数,也就是公司员工的总数。

1.2 SUM:计算总和

SUM 函数用于对数值列求和,通常用于计算总销售额、总工资等数值数据。

语法:

sql
SELECT SUM(列名) 
FROM 表名;

示例:

计算所有员工的总工资:

sql
SELECT SUM(Salary) AS TotalSalaries
FROM Employees;

这条查询会返回 Employees 表中所有员工的工资总和。

1.3 AVG:计算平均值

AVG 函数用于计算数值列的平均值,通常用于计算平均工资、平均销售额等。

语法:

sql
SELECT AVG(列名) 
FROM 表名;

示例:

计算员工的平均工资:

sql
SELECT AVG(Salary) AS AverageSalary
FROM Employees;

这条查询会返回所有员工的平均工资。

1.4 MIN:获取最小值

MIN 函数用于返回列中的最小值,通常用于查找最低工资、最早雇佣日期等。

语法:

sql
SELECT MIN(列名) 
FROM 表名;

示例:

获取员工的最低工资:

sql
SELECT MIN(Salary) AS LowestSalary
FROM Employees;

这条查询会返回公司员工的最低工资。

1.5 MAX:获取最大值

MAX 函数用于返回列中的最大值,通常用于查找最高工资、最晚雇佣日期等。

语法:

sql
SELECT MAX(列名) 
FROM 表名;

示例:

获取员工的最高工资:

sql
SELECT MAX(Salary) AS HighestSalary
FROM Employees;

这条查询会返回公司员工的最高工资。


2. GROUP BY 子句

2.1 什么是 GROUP BY?

GROUP BY 子句用于将查询结果按一个或多个列进行分组,然后对每组数据执行聚合函数。它通常与聚合函数一起使用。

语法:

sql
SELECT 列名1, 聚合函数(列名2)
FROM 表名
GROUP BY 列名1;

2.2 示例:按部门分组统计员工人数

sql
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;

这条查询会返回每个部门的员工总数,查询结果按 DepartmentID 进行分组。

2.3 示例:按职位分组计算平均工资

sql
SELECT JobTitle, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle;

这条查询会返回每个职位的平均工资,数据按 JobTitle 进行分组。


3. HAVING 子句

3.1 什么是 HAVING?

HAVING 子句用于过滤分组后的结果。它与 WHERE 类似,但 WHERE 不能用于聚合函数的过滤,而 HAVING 可以。

语法:

sql
SELECT 列名1, 聚合函数(列名2)
FROM 表名
GROUP BY 列名1
HAVING 聚合函数(列名2) 条件;

3.2 示例:筛选员工数超过10的部门

sql
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID
HAVING COUNT(EmployeeID) > 10;

这条查询会返回员工数超过10的部门。

3.3 示例:筛选平均工资超过50000的职位

sql
SELECT JobTitle, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle
HAVING AVG(Salary) > 50000;

这条查询会返回平均工资超过50000的职位。


4. 综合应用:聚合函数与 GROUP BY 和 HAVING 的结合使用

4.1 示例:按部门统计每个部门的总工资和平均工资,筛选出总工资超过500000的部门

sql
SELECT DepartmentID, SUM(Salary) AS TotalSalary, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY DepartmentID
HAVING SUM(Salary) > 500000;

这条查询会返回所有总工资超过500000的部门,并列出这些部门的总工资和平均工资。

4.2 示例:按雇佣年份统计每年的雇佣人数,筛选出雇佣人数超过50的年份

sql
SELECT YEAR(HireDate) AS HireYear, COUNT(EmployeeID) AS EmployeeCount
FROM Employees
GROUP BY YEAR(HireDate)
HAVING COUNT(EmployeeID) > 50;

这条查询会返回每年雇佣员工超过50人的年份。


5. 实战案例:多条件聚合查询

5.1 场景:公司希望统计各部门的平均工资和员工总数,并筛选出员工数超过20且平均工资超过60000的部门

我们可以使用以下查询语句:

sql
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY DepartmentID
HAVING COUNT(EmployeeID) > 20 AND AVG(Salary) > 60000;

这条查询会返回所有员工数超过20且平均工资高于60000的部门,并显示每个部门的员工总数和平均工资。

5.2 场景:公司希望分析每个职位的工资分布,统计各职位的最高工资、最低工资、平均工资和员工总数

sql
SELECT JobTitle, COUNT(EmployeeID) AS EmployeeCount, MAX(Salary) AS HighestSalary, MIN(Salary) AS LowestSalary, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle;

这条查询会返回每个职位的员工总数、最高工资、最低工资和平均工资,帮助公司分析各职位的薪酬分布情况。


6. 总结

在 SQL Server 中,聚合函数如 COUNT、SUM、AVG、MIN 和 MAX 是强大的工具,能够帮助我们快速统计和汇总数据。结合 GROUP BY 和 HAVING,我们可以对数据进行分组、过滤,并生成复杂的报表。

通过本文中的示例,你应该已经掌握了如何使用这些聚合函数进行查询操作,并了解了如何通过 GROUP BY 和 HAVING 来分组和过滤数据。聚合查询是 SQL 数据分析的重要组成部分,熟练掌握这些技术能够极大提高数据处理效率。


希望本文对你有所帮助,并为你在实际项目中的数据处理和统计提供指导。