在处理大量数据时,聚合函数是SQL查询中不可或缺的一部分,它们帮助我们对数据进行汇总、分析,提取出关键信息。MySQL支持多种聚合函数,如COUNT()
、SUM()
、AVG()
、MAX()
、MIN()
以及更高级的GROUP_CONCAT()
、STDDEV()
等。本文将深入探讨这些聚合函数的用法,结合具体实例,让你掌握如何高效地在MySQL中进行数据聚合。
一、COUNT()
COUNT()
函数用来计算行数,可以统计表中的所有行数或者满足特定条件的行数。
统计总行数
SELECT COUNT(*) FROM employees;
统计非空值
SELECT COUNT(salary) FROM employees;
二、SUM()
SUM()
函数用于计算一列数值的总和。
SELECT SUM(salary) FROM employees;
三、AVG()
AVG()
函数计算一列数值的平均值。
SELECT AVG(salary) FROM employees;
四、MAX() & MIN()
MAX()
和MIN()
分别用于找出一列中的最大值和最小值。
SELECT MAX(age), MIN(age) FROM employees;
五、GROUP BY与聚合函数的结合
通过GROUP BY
子句,可以将数据分为多个组,然后对每个组应用聚合函数。
按部门统计平均薪资
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
六、GROUP_CONCAT()
GROUP_CONCAT()
函数用于将同一组内的值连接成字符串,常用于生成列表或标签云。
SELECT department, GROUP_CONCAT(name SEPARATOR ', ') AS employees_list
FROM employees
GROUP BY department;
七、更高级的聚合函数
除了上述常用函数,MySQL还提供了如STDDEV()
(标准差)、VARIANCE()
(方差)等,用于统计分析。
计算薪资的标准差
SELECT STDDEV(salary) AS salary_stddev FROM employees;
八、WITH ROLLUP的使用
WITH ROLLUP
可以在GROUP BY
查询的结果基础上,额外生成一个汇总行。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department WITH ROLLUP;
这将不仅按部门分组计算平均薪资,还会在最后提供一个总体的平均薪资。
九、实战演练:员工薪资分析
假设有employees
表,包含id
、name
、department
、salary
字段,下面是一个综合应用案例,演示如何使用聚合函数进行数据分析。
任务
- 统计各部门员工数量。
- 计算公司整体的平均薪资、最高薪资和最低薪资。
- 分析各部门的平均薪资,并找出平均薪资最高的部门。
- 列出每个部门的员工名单。
SQL脚本
-- 1. 统计各部门员工数量
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
-- 2. 计算整体平均薪资、最高薪资和最低薪资
SELECT AVG(salary) AS overall_avg_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary
FROM employees;
-- 3. 分析各部门平均薪资,并找出平均薪资最高的部门
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC
LIMIT 1;
-- 4. 列出每个部门的员工名单
SELECT department, GROUP_CONCAT(name SEPARATOR ', ') AS employee_names
FROM employees
GROUP BY department;