GROUP BY 和 HAVING

已完成

为了在数据库中获取更深入的见解并更好地组织数据,SQL 引入了强大的 GROUP BYHAVING 子句。

借助这些工具,可以通过对行进行分类并应用聚合函数,将原始数据转化为有意义的摘要,从而更轻松地分析趋势、识别模式或生成针对特定类别定制的报表。

按组汇总

SQL 提供了 GROUP BY 子句来按类别或组分析数据。 此子句根据指定列中的值对行进行分类,从而有效地将数据分区为子集。

GROUP BY 的真正能力在与聚合函数结合使用时才会显现出来。 聚合函数(例如 COUNT()SUM()AVG()MIN()MAX())对这些组执行计算,使你能够为每个类别生成摘要统计信息。

例如,可以使用 GROUP BY 计算:- 每个产品类别的总销售额 SUM(),- 每家供应商的产品的平均价格 AVG(),- 每个城市的客户人数 COUNT()

SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id;

此查询通过根据 category_idsales.products 表的行进行分组来检索每个类别中的产品平均价格。 通过将 AVG() 函数应用于 price 列,查询将计算每个不同 category_id 下所有产品的价格平均值。

GROUP BY 子句并不总是需要与聚合函数配对。 虽然 GROUP BY 通常与聚合函数一起使用来对分组后的数据执行计算,但它也可以单独使用,将数据分到组中来实现其他目的,例如检索不同的列组合。

SELECT category_id
FROM sales.products
GROUP BY category_id;

此查询通过 category_id 在不执行任何聚合的情况下对行进行分组,只需列出 sales.products 表中存在的每个不同的 category_id

HAVING

在 SQL 中,WHERE 子句不能用于筛选聚合函数的结果。
要根据聚合函数结果筛选 GROUP BY 子句创建的组,请使用 HAVING 子句。
HAVING 视为针对组的 WHERE 子句:通过它可将条件应用于聚合函数生成的汇总数据,从而能够优化分析以专注于相关的组。

SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id
HAVING AVG(price) > 30;

此查询通过根据 category_idsales.products 表的行进行分组来计算每个类别中产品的平均 price。 然后,它使用 HAVING 筛选结果,以仅包含平均 price 超过 30 的类别。