当前位置: 首页 > article >正文

【SQL】掌握SQL查询技巧:数据聚合与分析

目录

  • 1. 什么是聚合函数?
  • 2. 常见聚合函数详解
    • 2.1 COUNT 函数
    • 2.2 SUM 函数
    • 2.3 AVG 函数
    • 2.4 MIN 和 MAX 函数
  • 3. 聚合函数的可视化示例
  • 3. 使用 `GROUP BY` 进行分组
  • 4. 使用 `HAVING` 子句过滤聚合结果
  • 5. 使用 `GROUP BY` 和 `ORDER BY` 进行分组和排序
  • 5. 实际应用案例
    • 5.1 实现销售业绩分析
    • 5.2 员工绩效考核
  • 6. 图示展示
  • 7. 注意事项
  • 8. 优化建议
  • 结论

SQL(结构化查询语言)是关系数据库管理系统中操作数据的标准语言,聚合函数在数据分析和报告中扮演着重要角色,广泛应用于数据分析、报表生成和决策支持。它们允许对一组数据执行计算,以获取有用的信息。本文将深入探讨 SQL 中的聚合函数,包括其定义、常见类型、使用示例及实际应用场景,帮助读者掌握如何有效地从数据库中提取和分析数据。此外,我们还将提供注意事项和优化建议,通过图表和可视化示例加深理解,使您能够更好地利用聚合函数进行数据汇总与决策支持。

1. 什么是聚合函数?

聚合函数是在 SQL 查询中对一组值进行计算,并返回一个单一值的函数。它们通常用于分析和汇总大量数据,帮助我们从数据集中提取有用的信息。聚合函数常见的用途包括统计数量、计算总和、求取平均值等。

常见的聚合函数

函数描述使用场景
COUNT计算行数统计记录数量
SUM计算数值总和计算销售额、支出总和等
AVG计算平均值评估成绩、薪资的平均水平
MIN找到最小值确定最低价格、最低温度等
MAX找到最大值确定最高价格、最高温度等

2. 常见聚合函数详解

2.1 COUNT 函数

COUNT 函数用于计算结果集中行数或某一列的非空值数量。可以用来统计整个表中的记录数,或在特定条件下的记录数。

示例:

SELECT COUNT(*) AS total_rows
FROM employees;

说明:

  • COUNT(*) 会计算所有行的数量,包括 NULL 值。
  • AS total_rows 为结果列命名,使输出更易读。

COUNT 的变体

可以使用 COUNT(column_name) 来计算指定列非 NULL 值的数量。例如:

SELECT COUNT(salary) AS num_salaries
FROM employees;

这将只计算有薪资信息的员工数量。

使用示例

假设我们有一个 employees 表,包含如下数据:

idnamedepartmentsalary
1AliceHR60000
2BobIT75000
3CharlieIT70000
4DavidHRNULL

要统计员工总数(不包括薪资为 NULL 的行):

SELECT COUNT(*) AS total_employees
FROM employees;

输出结果

total_employees
4

要统计 IT 部门的员工数量:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

输出结果

departmentemployee_count
HR2
IT2

2.2 SUM 函数

SUM 函数用于计算数值列的总和,是财务和销售分析中不可或缺的工具。

示例:

SELECT SUM(salary) AS total_salary
FROM employees;

说明:

  • 此查询计算所有员工的薪资总和,可以用于预算和人力资源分析。

使用示例

继续使用 employees 表,计算所有员工的薪资总和:

SELECT SUM(salary) AS total_salary
FROM employees;

输出结果

total_salary
205000

要统计每个部门的薪资总和:

SELECT department, SUM(salary) AS department_salary
FROM employees
GROUP BY department;

输出结果

departmentdepartment_salary
HR60000
IT145000

2.3 AVG 函数

AVG 函数用于计算数值列的平均值,通常用于评估绩效或比较不同组的表现。

示例:

SELECT AVG(salary) AS average_salary
FROM employees;

说明:

  • 该查询返回所有员工薪资的平均值,帮助管理层了解整体薪资水平。

使用示例

要计算所有员工的平均薪资:

SELECT AVG(salary) AS average_salary
FROM employees;

输出结果

average_salary
102500

要计算每个部门的平均薪资:

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

输出结果

departmentaverage_salary
HR30000
IT72500

2.4 MIN 和 MAX 函数

MINMAX 函数分别用于查找列中的最小值和最大值,常用于数据范围分析。

示例:

SELECT MIN(salary) AS min_salary, MAX(salary) AS max_salary
FROM employees;

说明:

  • 该查询返回员工薪资的最低和最高值,适用于薪资结构分析。

使用示例

要查找员工中的最高薪资和最低薪资:

SELECT MAX(salary) AS highest_salary, MIN(salary) AS lowest_salary
FROM employees;

输出结果

highest_salarylowest_salary
75000NULL

要查找每个部门的最高和最低薪资:

SELECT department, MAX(salary) AS highest_salary, MIN(salary) AS lowest_salary
FROM employees
GROUP BY department;

输出结果

departmenthighest_salarylowest_salary
HR60000NULL
IT7500070000

3. 聚合函数的可视化示例

下面的图示展示了聚合函数如何在数据处理中工作。

Count
Sum
Avg
Max/Min
CSDN @ 2136
Employees Table
Total Employees
Total Salary
Average Salary
Highest/Lowest Salary
CSDN @ 2136

说明:

  • Employees Table:原始数据表,包含所有员工记录。
  • Total Employees:通过 COUNT 计算员工总数。
  • Total Salary:通过 SUM 计算所有员工薪资总和。
  • Average Salary:通过 AVG 计算员工薪资平均值。
  • Highest/Lowest Salary:通过 MAXMIN 查找最高和最低薪资。

3. 使用 GROUP BY 进行分组

聚合函数通常与 GROUP BY 子句一起使用,以便在不同的组上进行计算。这对于分析不同分类的数据非常有用。例如,我们可以按部门统计员工数量和平均薪资,以帮助公司进行绩效评估和资源分配。

示例

SELECT department, COUNT(*) AS num_employees, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

说明:

  • department:这是我们将数据分组的字段。每个部门将作为一个组进行处理。
  • COUNT(*):计算每个部门的员工总数,返回每个部门的员工人数。
  • AVG(salary):计算每个部门员工的平均薪资。
  • GROUP BY department:指定按部门进行分组,使得查询结果按部门显示。

输出结果

departmentnum_employeesavg_salary
HR230000
IT272500

这个查询结果让管理层了解各部门的员工构成及其薪资水平,从而更好地进行资源配置。

4. 使用 HAVING 子句过滤聚合结果

HAVING 子句用于过滤聚合结果,这类似于 WHERE 子句,但适用于聚合后的数据。这使得我们能够对聚合结果施加条件,筛选出符合特定标准的组。

使用示例

SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department
HAVING COUNT(*) > 1;

说明

  • HAVING COUNT(*) > 1:这条条件语句确保只返回拥有超过 1 名员工的部门。这对于识别员工较少的部门尤为重要,可以帮助管理层关注这些小团队的需求。

输出结果

departmentnum_employees
HR2
IT2

当然!下面是结合使用 GROUP BYORDER BY 的示例以及用 Mermaid 绘制的分组和排序示意图。

5. 使用 GROUP BYORDER BY 进行分组和排序

通过结合 GROUP BYORDER BY,我们不仅可以对数据进行分组,还可以对聚合结果进行排序。这对于快速识别最高或最低的值非常有用。例如,我们可以按平均工资对部门进行排序,以找出哪些部门的薪资水平较高。

示例

SELECT department, COUNT(*) AS num_employees, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC;

说明

  • ORDER BY avg_salary DESC: 这将根据每个部门的平均工资对结果进行降序排序,从而使得最高平均工资的部门排在前面。

输出结果

departmentnum_employeesavg_salary
IT272500
HR230000

这个查询结果帮助管理层快速识别出各部门的平均工资情况,使其能够更好地进行薪酬管理与资源配置。

分组和排序示意图

CSDN @ 2136
员工数据
按部门分组
HR
IT
计算: 员工数量, 平均工资
按平均工资排序
IT: 72500
HR: 30000
CSDN @ 2136

解释图示

  1. 员工数据是原始数据集。
  2. 按部门分组将员工数据分为不同部门(HR 和 IT)。
  3. 每个部门都计算了员工数量平均工资
  4. 最后,结果按平均工资进行排序,显示出各部门的薪资水平。

5. 实际应用案例

5.1 实现销售业绩分析

在商业分析中,我们常常需要通过聚合函数来评估产品的销售业绩。例如,商家可能想要确定哪些产品的销售额高于特定阈值。

示例表数据

sales 表

product_idsales_amount
P0015000
P0016000
P0023000
P0027000
P0034000

说明:

  • product_id:产品的唯一标识符。
  • sales_amount:每笔销售的金额。

SQL 查询

SELECT product_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product_id
HAVING SUM(sales_amount) > 10000;

注释:

  • SELECT product_id:选择产品 ID 列。
  • SUM(sales_amount) AS total_sales:计算每个产品的总销售额,并将结果命名为 total_sales
  • FROM sales:指定从 sales 表中获取数据。
  • GROUP BY product_id:按产品 ID 对数据进行分组,使得每个产品的销售额被汇总。
  • HAVING SUM(sales_amount) > 10000:仅返回总销售额超过 10,000 的产品。

输出结果

product_idtotal_sales
P00111000
P00210000

输出说明:

  • 结果显示,产品 P001 的总销售额为 11,000,产品 P002 的总销售额恰好为 10,000。只有这些产品满足条件,因此它们被返回。

5.2 员工绩效考核

示例表数据

employee_performance 表

manager_idemployee_idperformance_score
M001E0013
M001E0022
M001E0034
M002E0042
M002E0053
M002E0061

说明:

  • manager_id:每位经理的唯一标识符。
  • employee_id:每位员工的唯一标识符。
  • performance_score:员工的绩效评分,通常是一个数字,越高表示表现越好。

SQL 查询

SELECT manager_id, AVG(performance_score) AS avg_performance
FROM employee_performance
GROUP BY manager_id
HAVING AVG(performance_score) < 3.0;

注释:

  • SELECT manager_id:选择经理 ID 列。
  • AVG(performance_score) AS avg_performance:计算每位经理下属的平均绩效评分,并将结果命名为 avg_performance
  • FROM employee_performance:指定从 employee_performance 表中获取数据。
  • GROUP BY manager_id:按经理 ID 对数据进行分组,使得每位经理的平均绩效被计算。
  • HAVING AVG(performance_score) < 3.0:只返回那些平均绩效评分低于 3.0 的经理。

输出结果

manager_idavg_performance
M0022.0

输出说明:

  • 结果显示,经理 M002 的下属平均绩效评分为 2.0,低于 3.0。这提示管理层需要关注这一团队,可能需要采取措施来提升其表现。

6. 图示展示

以下是 SQL 聚合函数的简要流程图,展示了其使用过程。

COUNT
SUM
AVG
MIN
MAX
CSDN @ 2136
数据源
选择聚合函数
返回行数
返回总和
返回平均值
返回最小值
返回最大值
结果集
可选: GROUP BY
可选: HAVING
CSDN @ 2136

7. 注意事项

在使用聚合函数时,有一些注意事项需要牢记:

  • 与 GROUP BY 结合使用:聚合函数只能在 GROUP BY 的上下文中使用。若没有分组,聚合函数将作用于整个结果集。

  • HAVING 的使用HAVING 子句在 GROUP BY 后应用,用于过滤聚合结果,而 WHERE 则是在聚合前过滤行。如果需要对聚合结果进行过滤,可使用 HAVING 子句,而不是 WHERE

  • NULL 值处理:聚合函数对 NULL 值的处理不同。例如,COUNT(column_name) 不会计入 NULL 值,而 COUNT(*) 会计入所有行;SUMAVG 不会将 NULL 值计入总和。。

8. 优化建议

在使用聚合函数时,优化查询性能是非常关键的,尤其是在处理大型数据集时。以下是一些优化建议:

  • 创建索引:在经常用于聚合的列上创建索引,可以提高查询速度。

  • 避免过多的聚合操作:尽量减少不必要的聚合操作,特别是在大型数据集上,因为这可能导致性能下降。

  • 使用适当的数据类型:确保使用适当的数据类型来存储数据,避免在聚合时进行不必要的类型转换。

结论

SQL 聚合函数是数据分析和报告中的重要工具。通过理解和掌握这些函数,能够有效地从数据中提取有价值的信息。无论是进行财务分析、员工绩效考核还是市场调查,聚合函数都能帮助你快速做出决策。希望本文能为你提供一个全面的概述,助你在 SQL 数据库的世界中游刃有余。如需进一步学习,可以参考 SQL 官方文档或相关书籍。



http://www.kler.cn/news/337315.html

相关文章:

  • 毕业设计选题:基于ssm+vue+uniapp的模拟考试小程序
  • react项目引入ant-design
  • ​牧​原​二​面​
  • 仿RabbitMQ实现消息队列客户端
  • 【VUE】Vue中template模版编译原理
  • javascript中原型链(__proto__)与原型(prototype)
  • numpy np.stack 介绍
  • IL2CPP和Mono的区别
  • solidity中的函数详解
  • 73.【C语言】C/C++的内存区域划分
  • [单master节点k8s部署]31.ceph分布式存储(二)
  • 医院管理新思维:Spring Boot技术应用
  • Maven 高级之分模块设计与继承、聚合
  • springboot中配置优先级
  • idea2023-快速搭建一个本地tomcat的javaWeb项目(从0到1保姆教学)
  • Ubuntu 中 Redis ,MySQL 基本使用
  • PostgreSQL技术内幕13:PostgreSQL通讯协议
  • LLM大模型学习总结
  • 基于SpringBoot+Vue的宠物店管理系统
  • Qt - ui界面点击加载一段时间后闪退