聚合函数
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 值的数量。
语法:
SELECT COUNT(列名)
FROM 表名;示例:
统计公司员工总数:
SELECT COUNT(EmployeeID) AS TotalEmployees
FROM Employees;这条查询会返回 Employees 表中 EmployeeID 列的非空记录数,也就是公司员工的总数。
1.2 SUM:计算总和
SUM 函数用于对数值列求和,通常用于计算总销售额、总工资等数值数据。
语法:
SELECT SUM(列名)
FROM 表名;示例:
计算所有员工的总工资:
SELECT SUM(Salary) AS TotalSalaries
FROM Employees;这条查询会返回 Employees 表中所有员工的工资总和。
1.3 AVG:计算平均值
AVG 函数用于计算数值列的平均值,通常用于计算平均工资、平均销售额等。
语法:
SELECT AVG(列名)
FROM 表名;示例:
计算员工的平均工资:
SELECT AVG(Salary) AS AverageSalary
FROM Employees;这条查询会返回所有员工的平均工资。
1.4 MIN:获取最小值
MIN 函数用于返回列中的最小值,通常用于查找最低工资、最早雇佣日期等。
语法:
SELECT MIN(列名)
FROM 表名;示例:
获取员工的最低工资:
SELECT MIN(Salary) AS LowestSalary
FROM Employees;这条查询会返回公司员工的最低工资。
1.5 MAX:获取最大值
MAX 函数用于返回列中的最大值,通常用于查找最高工资、最晚雇佣日期等。
语法:
SELECT MAX(列名)
FROM 表名;示例:
获取员工的最高工资:
SELECT MAX(Salary) AS HighestSalary
FROM Employees;这条查询会返回公司员工的最高工资。
2. GROUP BY 子句
2.1 什么是 GROUP BY?
GROUP BY 子句用于将查询结果按一个或多个列进行分组,然后对每组数据执行聚合函数。它通常与聚合函数一起使用。
语法:
SELECT 列名1, 聚合函数(列名2)
FROM 表名
GROUP BY 列名1;2.2 示例:按部门分组统计员工人数
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;这条查询会返回每个部门的员工总数,查询结果按 DepartmentID 进行分组。
2.3 示例:按职位分组计算平均工资
SELECT JobTitle, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle;这条查询会返回每个职位的平均工资,数据按 JobTitle 进行分组。
3. HAVING 子句
3.1 什么是 HAVING?
HAVING 子句用于过滤分组后的结果。它与 WHERE 类似,但 WHERE 不能用于聚合函数的过滤,而 HAVING 可以。
语法:
SELECT 列名1, 聚合函数(列名2)
FROM 表名
GROUP BY 列名1
HAVING 聚合函数(列名2) 条件;3.2 示例:筛选员工数超过10的部门
SELECT DepartmentID, COUNT(EmployeeID) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID
HAVING COUNT(EmployeeID) > 10;这条查询会返回员工数超过10的部门。
3.3 示例:筛选平均工资超过50000的职位
SELECT JobTitle, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle
HAVING AVG(Salary) > 50000;这条查询会返回平均工资超过50000的职位。
4. 综合应用:聚合函数与 GROUP BY 和 HAVING 的结合使用
4.1 示例:按部门统计每个部门的总工资和平均工资,筛选出总工资超过500000的部门
SELECT DepartmentID, SUM(Salary) AS TotalSalary, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY DepartmentID
HAVING SUM(Salary) > 500000;这条查询会返回所有总工资超过500000的部门,并列出这些部门的总工资和平均工资。
4.2 示例:按雇佣年份统计每年的雇佣人数,筛选出雇佣人数超过50的年份
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的部门
我们可以使用以下查询语句:
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 场景:公司希望分析每个职位的工资分布,统计各职位的最高工资、最低工资、平均工资和员工总数
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 数据分析的重要组成部分,熟练掌握这些技术能够极大提高数据处理效率。
希望本文对你有所帮助,并为你在实际项目中的数据处理和统计提供指导。