目录

  1. GROUP BY 的基本语法
  2. GROUP BY 与聚合函数
  3. 分组排序
  4. HAVING 子句
  5. GROUP BY 多列分组
  6. GROUP BYDISTINCT
  7. 性能考虑
  8. 参考资料

GROUP BY 的基本语法

GROUP BY 子句用于将查询结果按照一个或多个列进行分组,常常与聚合函数(如 COUNT()SUM()AVG() 等)一起使用。它可以帮助你将相同类型的数据行聚合成一个组。

基本语法:

SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2;

  • column1, column2: 用于分组的列。
  • aggregate_function(column3): 聚合函数(如 COUNT()SUM()AVG() 等)。
  • table_name: 查询的数据表。
  • condition: 可选的过滤条件。

GROUP BY 与聚合函数

GROUP BY 通常与聚合函数一起使用,用于计算每个组的统计信息。常见的聚合函数包括:

  • COUNT():统计行数
  • SUM():求和
  • AVG():平均值
  • MIN():最小值
  • MAX():最大值

示例:计算每个类别的产品数量

SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category;

此查询按 category 分组,并计算每个类别中产品的数量。

示例:计算每个类别的总销售额

SELECT category, SUM(price * quantity) AS total_sales
FROM sales
GROUP BY category;

此查询按 category 分组,并计算每个类别的总销售额。


分组排序

你可以在使用 GROUP BY 时结合 ORDER BY 子句对分组结果进行排序。排序可以按照聚合结果或者分组列的值进行。

示例:按销售总额降序排序

SELECT category, SUM(price * quantity) AS total_sales
FROM sales
GROUP BY category
ORDER BY total_sales DESC;

此查询计算每个类别的总销售额,并按降序排列结果。

示例:按类别升序排序,销售总额降序排序

SELECT category, SUM(price * quantity) AS total_sales
FROM sales
GROUP BY category
ORDER BY category ASC, total_sales DESC;

此查询首先按类别升序排序,如果类别相同,则按总销售额降序排序。


HAVING 子句

HAVING 子句用于对分组后的结果进行过滤。它类似于 WHERE 子句,但 WHERE 子句用于过滤单个行,HAVING 子句用于过滤分组后的结果。

示例:筛选出销售总额超过 10000 的类别

SELECT category, SUM(price * quantity) AS total_sales
FROM sales
GROUP BY category
HAVING total_sales > 10000;

此查询按 category 分组并计算每个类别的销售总额,接着使用 HAVING 过滤出销售总额大于 10000 的类别。

注意:HAVING 必须在 GROUP BY 之后使用,而 WHERE 是在 GROUP BY 之前使用的。


GROUP BY 多列分组

GROUP BY 可以同时按多个列进行分组,结果会根据多个列的组合来形成不同的分组。

示例:按 categorybrand 分组,并计算每个品牌在每个类别中的产品数量

SELECT category, brand, COUNT(*) AS product_count
FROM products
GROUP BY category, brand;

此查询首先按 category 分组,如果 category 相同,则按 brand 分组,最终计算每个品牌在每个类别中的产品数量。


GROUP BYDISTINCT

GROUP BYDISTINCT 都用于消除重复数据,但它们的使用场景有所不同。DISTINCT 用于去重单列数据,而 GROUP BY 用于对多个列进行分组并且通常配合聚合函数。

示例:使用 DISTINCT 去重

SELECT DISTINCT category
FROM products;

此查询返回 products 表中唯一的 category 值。

示例:使用 GROUP BY 分组

SELECT category, COUNT(*)
FROM products
GROUP BY category;

此查询按 category 分组,并返回每个类别的产品数量。


性能考虑

  • 索引:为了提高 GROUP BY 操作的性能,确保分组的列有适当的索引。没有索引的列可能导致性能下降,特别是在处理大量数据时。
  • 内存使用:在处理大数据集时,GROUP BY 操作可能会占用大量内存。尽量限制返回的行数或使用分页技术来减少内存消耗。
  • HAVINGWHERE:尽量使用 WHERE 子句过滤数据,避免在 GROUP BY 后使用 HAVING 进行过多的计算。HAVING 通常应仅在需要聚合函数进行筛选时使用。

参考资料


如果你有更多关于 GROUP BY 的问题,或者需要优化查询的建议,随时告诉我!