Skip to content

MySQL - 聚合函数

在 SQL 中,聚合函数 (aggregate functions) 对一组行执行计算并返回单个汇总值。这些函数是数据分析和报告的基础。它们通常与 GROUP BY 子句一起使用,以计算各种行子组的聚合值。本教程涵盖了 MySQL 中最常见的聚合函数,包括现代新增功能和最佳实践。

这些是您在大多数查询中会用到的基础聚合函数:

函数描述
COUNT()计算行数。COUNT(*) 计算所有行,COUNT(column) 计算列中的非 NULL 值,COUNT(DISTINCT column) 计算列中唯一的非 NULL 值。
SUM()计算一组数值的总和。
AVG()计算一组数值的平均值。
MIN()返回一组值中的最小值。
MAX()返回一组值中的最大值。
GROUP_CONCAT()将组中的值连接成一个字符串,并提供多种排序和分隔符选项。

假设有一个 products 表,其中包含 category(类别)、price(价格)和 stock_quantity(库存数量)列。我们可以为每个类别获取一个汇总信息:

SELECT
category,
COUNT(*) AS number_of_products,
SUM(stock_quantity) AS total_stock,
AVG(price) AS average_price,
MAX(price) AS most_expensive
FROM
products
GROUP BY
category;

MySQL 还提供了用于更高级统计分析和位运算的函数。

函数描述
STDDEV_POP()计算总体标准差。STD() 和 STDDEV() 是此函数的别名。
STDDEV_SAMP()计算样本标准差。
VAR_POP()计算总体方差。VARIANCE() 是此函数的别名。
VAR_SAMP()计算样本方差。
BIT_AND()计算组中所有值的按位与(AND)。
BIT_OR()计算组中所有值的按位或(OR)。
BIT_XOR()计算组中所有值的按位异或(XOR)。

随着 JSON 作为数据交换格式的兴起,MySQL 引入了强大的函数,可以直接将数据聚合到 JSON 结构中。

函数描述
JSON_ARRAYAGG()将组中的值聚合为一个 JSON 数组。
JSON_OBJECTAGG()将组中的键值对聚合为一个 JSON 对象。

使用相同的 products 表,我们可以按类别将产品名称分组到 JSON 数组中:

SELECT
category,
JSON_ARRAYAGG(product_name) AS products_in_category
FROM
products
GROUP BY
category;

尽管不完全是聚合函数,但窗口函数 (Window Functions) 对与当前行相关的表行集执行计算。与聚合函数不同,它们不会折叠行;它们根据 OVER() 子句定义的“窗口”相关行,为每行返回一个值。它们通常与聚合函数一起用于高级报告和分析,例如计算运行总计、排名和移动平均值。

常见的窗口函数包括 ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG(),以及用作窗口函数的聚合函数(例如 SUM(...) OVER (...))。掌握聚合函数后,深入了解它们是很好的下一步。