您好,登录后才能下订单哦!
# MySQL中的聚合函数怎么用
## 一、聚合函数概述
### 1.1 什么是聚合函数
聚合函数(Aggregate Functions)是SQL中用于对一组值执行计算并返回单个值的特殊函数。这些函数通常与GROUP BY子句结合使用,用于对数据进行分组统计和分析。
在MySQL中,聚合函数通过对多行数据进行计算,将多行数据"聚合"为单个汇总结果。常见的聚合函数包括COUNT()、SUM()、AVG()、MAX()、MIN()等。
### 1.2 聚合函数的特点
1. **单值返回**:无论处理多少行数据,最终只返回一个计算结果
2. **忽略NULL值**:大多数聚合函数会自动忽略NULL值(COUNT(*)除外)
3. **与GROUP BY配合**:通常用于分组统计
4. **性能考虑**:在大数据量时可能影响查询性能
### 1.3 常用聚合函数列表
| 函数名 | 功能描述 | 语法示例 |
|--------|----------|----------|
| COUNT() | 计数 | COUNT(expr) |
| SUM() | 求和 | SUM(column) |
| AVG() | 平均值 | AVG(column) |
| MAX() | 最大值 | MAX(column) |
| MIN() | 最小值 | MIN(column) |
| GROUP_CONCAT() | 连接字符串 | GROUP_CONCAT(expr) |
| STD() / STDDEV() | 标准差 | STD(column) |
| VARIANCE() | 方差 | VARIANCE(column) |
## 二、基础聚合函数详解
### 2.1 COUNT() 函数
#### 2.1.1 基本用法
COUNT()函数用于计算行数或非NULL值的数量。
```sql
-- 计算表中的总行数
SELECT COUNT(*) FROM employees;
-- 计算特定列的非NULL值数量
SELECT COUNT(salary) FROM employees;
-- 计算不同值的数量
SELECT COUNT(DISTINCT department_id) FROM employees;
SUM()函数用于计算数值列的总和。
-- 计算所有员工工资总和
SELECT SUM(salary) FROM employees;
-- 计算特定条件下的总和
SELECT SUM(salary) FROM employees WHERE department_id = 10;
-- 计算表达式结果的总和
SELECT SUM(salary * commission_pct) FROM employees;
AVG()函数用于计算数值列的平均值。
-- 计算平均工资
SELECT AVG(salary) FROM employees;
-- 计算不同分组的平均值
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 计算加权平均
SELECT SUM(salary * years_of_service)/SUM(years_of_service)
FROM employees;
MAX()和MIN()分别用于找出列中的最大值和最小值。
-- 找出最高和最低工资
SELECT MAX(salary), MIN(salary) FROM employees;
-- 找出每个部门最高工资
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
-- 可用于非数值类型
SELECT MAX(hire_date), MIN(hire_date) FROM employees;
GROUP_CONCAT()将多行数据合并为一个字符串。
-- 将部门员工姓名连接为字符串
SELECT department_id,
GROUP_CONCAT(last_name ORDER BY salary DESC SEPARATOR ', ')
FROM employees
GROUP BY department_id;
DISTINCT
:去除重复值ORDER BY
:指定连接顺序SEPARATOR
:设置分隔符(默认为逗号)-- 计算工资的标准差和方差
SELECT STD(salary), VARIANCE(salary) FROM employees;
MySQL还提供了一些位操作聚合函数:
-- 位与、位或操作
SELECT BIT_AND(flags), BIT_OR(flags) FROM permissions;
GROUP BY子句将结果集按一列或多列分组,通常与聚合函数一起使用。
-- 按部门分组计算平均工资
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 按部门和职位分组
SELECT department_id, job_id, COUNT(*)
FROM employees
GROUP BY department_id, job_id;
WITH ROLLUP添加分组汇总行。
-- 添加汇总行
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id WITH ROLLUP;
HAVING子句用于过滤分组后的结果。
-- 筛选平均工资大于10000的部门
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 10000;
MySQL 8.0+支持窗口函数,可以在不减少行数的情况下应用聚合函数。
-- 计算各部门工资及部门平均工资
SELECT
employee_id,
salary,
AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary
FROM employees;
为GROUP BY和聚合列创建合适索引:
-- 为经常分组的列创建索引
CREATE INDEX idx_dept ON employees(department_id);
避免在WHERE子句中使用聚合函数:
-- 不好的写法
SELECT department_id FROM employees
WHERE AVG(salary) > 10000
GROUP BY department_id;
-- 正确写法
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING avg_salary > 10000;
使用EXPLN分析GROUP BY查询:
EXPLN SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id;
-- 按月统计销售总额和订单数
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(DISTINCT order_id) AS orders,
SUM(amount) AS total_sales,
AVG(amount) AS avg_order_value
FROM sales
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
-- 用户活跃度分析
SELECT
user_id,
COUNT(*) AS total_actions,
COUNT(DISTINCT DATE(action_time)) AS active_days,
MIN(action_time) AS first_action,
MAX(action_time) AS last_action
FROM user_actions
GROUP BY user_id
HAVING active_days > 5;
MySQL不允许直接嵌套聚合函数,但可以使用子查询:
-- 错误写法
SELECT AVG(SUM(salary)) FROM employees GROUP BY department_id;
-- 正确写法
SELECT AVG(dept_total)
FROM (SELECT SUM(salary) AS dept_total
FROM employees
GROUP BY department_id) AS temp;
大多数聚合函数自动忽略NULL值,COUNT(*)除外。可以使用COALESCE处理:
SELECT AVG(COALESCE(salary, 0)) FROM employees;
MySQL 8.0前,GROUP BY隐式排序,8.0后不保证顺序。应显式使用ORDER BY:
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
ORDER BY department_id;
MySQL聚合函数是数据分析的强大工具,掌握它们可以高效地进行数据汇总和统计。关键点总结:
通过本文的学习,您应该能够熟练运用MySQL中的各种聚合函数来解决实际的数据分析问题。
本文共计约8850字,详细介绍了MySQL中聚合函数的各种用法、技巧和最佳实践。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。