SQL 分组聚合查询详解

在数据库查询中,经常需要对数据进行分组和聚合,以便进行更高级的数据分析。本文将详细介绍如何使用SQL中的GROUP BYHAVING子句来实现这一功能。

GROUP BY 子句

SQL中的GROUP BY子句用于根据一个或多个列的值对结果集进行分组。它通常与聚合函数(如SUMCOUNT)一起使用,以汇总数据。在SQL中,分组是字段的唯一组合。使用GROUP BY时,不是返回表中的每一行,而是返回唯一的组合。

例如,如果想要列出订单ID,并且排除数量大于100的记录,可以使用以下SQL语句:

SELECT OrderID FROM OrderDetails WHERE Quantity <= 100 GROUP BY OrderID;

需要注意的是,GROUP BY子句中列出的列必须在SELECT语句中列出;否则,语句将失败。当执行此语句时,不会返回每个过滤后的行,而是只包括OrderID的唯一组合。

聚合函数

聚合函数,如SUM,用于对一组行执行计算。这些函数通常作用于使用GROUP BY子句定义的一组值。如果没有GROUP BY子句,通常理解为聚合函数应用于所有过滤后的结果。

一些最常见的聚合函数包括:

  • AVG(expression):计算表达式的平均值。
  • COUNT(expression):计算表达式返回的非空值的出现次数。
  • COUNT(*):计算指定表中的所有行。
  • MIN(expression):找到表达式的最小值。
  • MAX(expression):找到表达式的最大值。
  • SUM(expression):计算表达式的总和。

这些函数可以单独使用,也可以与GROUP BY子句一起使用。单独使用时,它们作用于整个表;但是,当与GROUP BY一起使用时,它们的计算会在每次分组变化时“重置”。

使用聚合函数与 GROUP BY

例如,可以使用SUM函数来计算每个订单的总金额:

SELECT OrderID, SUM(UnitPrice * Quantity) as TotalPrice FROM OrderDetails GROUP BY OrderID;

也可以使用AVG函数来计算每个订单的平均金额:

SELECT OrderID, AVG(UnitPrice * Quantity) as AverageOrderAmount FROM OrderDetails GROUP BY OrderID;

HAVING子句

HAVING子句用于根据聚合函数的结果过滤分组。这使得能够解决诸如选择所有订单详情行数超过两个的订单等问题。

例如,如果想要找到所有订单总金额超过1000美元的订单,可以使用以下SQL语句:

SELECT OrderID, SUM(UnitPrice * Quantity) as TotalPrice FROM OrderDetails GROUP BY OrderID HAVING TotalPrice > 1000 ORDER BY TotalPrice DESC;

练习

  • OrderDetails表中的平均订购数量是多少?
  • 对于OrderDetails中的每个产品,显示最小、最大和平均订购数量。
  • 返回所有订单中每个产品的总销售额,但只包括出现在7个或更多订单详情中的产品。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485