聚合函数是对一组值执行计算并返回单一值的函数,常用于数据统计和分析场景。MariaDB 提供了丰富的聚合函数,以下是常用的几种:
COUNT()
:计数SUM()
:求和AVG()
:平均值MAX()
:最大值MIN()
:最小值GROUP_CONCAT()
:连接字符串STDDEV()
/ STDDEV_POP()
:标准差VARIANCE()
/ VAR_POP()
:方差-- 计算表中的记录数
SELECT COUNT(*) FROM employees;
-- 计算某列非NULL值的数量
SELECT COUNT(department_id) FROM employees;
-- 计算不重复值的数量
SELECT COUNT(DISTINCT department_id) FROM employees;
-- 计算某列总和
SELECT SUM(salary) FROM employees;
-- 带条件的求和
SELECT SUM(salary) FROM employees WHERE department_id = 10;
-- 计算平均值
SELECT AVG(salary) FROM employees;
-- 计算非NULL值的平均值
SELECT AVG(commission_pct) FROM employees;
-- 最大值和最小值
SELECT MAX(salary), MIN(salary) FROM employees;
-- 日期最大值
SELECT MAX(hire_date) FROM employees;
GROUP BY 子句将结果集按一个或多个列的值分组,通常与聚合函数一起使用。
-- 按部门分组计算平均工资
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 按部门和职位分组
SELECT department_id, job_id, COUNT(*), AVG(salary)
FROM employees
GROUP BY department_id, job_id;
HAVING 子句用于对分组后的结果进行筛选,类似于 WHERE 但作用于分组后的数据。
-- 筛选平均工资大于8000的部门
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING avg_salary > 8000;
-- 按部门平均工资降序排列
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
ORDER BY avg_salary DESC;
将分组中的值连接成字符串,常用于生成逗号分隔的列表。
-- 列出每个部门的员工姓名
SELECT department_id, GROUP_CONCAT(first_name ORDER BY first_name SEPARATOR ', ')
FROM employees
GROUP BY department_id;
虽然严格来说不是聚合函数,但窗口函数常与聚合一起使用。
-- 计算每个员工的工资及其所在部门的平均工资
SELECT
first_name,
salary,
AVG(salary) OVER (PARTITION BY department_id) as dept_avg_salary
FROM employees;
-- 统计各部门人数、平均工资、最高和最低工资
SELECT
department_id,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
MAX(salary) as max_salary,
MIN(salary) as min_salary,
GROUP_CONCAT(last_name ORDER BY salary DESC SEPARATOR ', ') as employees
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING employee_count > 3
ORDER BY avg_salary DESC;
通过掌握这些聚合函数和分组查询技术,您可以有效地从 MariaDB 数据库中提取汇总信息和统计数据,为业务分析和决策提供支持。