Skip to content

SQL Group By

SQL 中的 GROUP BY 语句用于将相同的数据排列成组。它几乎总是与聚合函数(如 COUNT()、SUM()、AVG()、MAX()、MIN())结合使用,以计算每个组的度量。

GROUP BY 语句将一个或多个指定列中具有相同值的行分组为一个汇总行。对于每个组,您可以应用聚合函数来计算汇总统计信息。

一个关键规则:使用 GROUP BY 时,SELECT 列表中任何不属于聚合函数的列都必须包含在 GROUP BY 子句中。这确保了结果集中的每一行都对应一个唯一的组。

SELECT column_name1, column_name2, …, aggregate_function(column_nameX) FROM table_name WHERE condition GROUP BY column_name1, column_name2, … ORDER BY column_name1, …;

逻辑执行顺序:

理解逻辑处理顺序有助于编写复杂的查询:

  1. FROM (和 JOIN):指定表。
  2. WHERE:在分组前过滤单行。
  3. GROUP BY:基于指定列对行分组。
  4. HAVING:过滤 GROUP BY 创建的组(类似于 WHERE,但针对组)。
  5. SELECT:选择列并应用聚合函数。
  6. DISTINCT:从结果中移除重复行。
  7. ORDER BY:对最终结果集排序。
  8. LIMIT / OFFSET / TOP:限制返回的行数。

在本教程中,我们将使用受 Northwind 示例数据库启发的概念性表。假设我们有 “Orders”、“Shippers” 和 “Employees” 表。

示例 “Orders” 表数据:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082
102518431996-07-081
102527641996-07-092

示例 “Shippers” 表数据:

ShipperIDShipperNamePhone
1Speedy Express(503) 555-9831
2United Package(503) 555-3199
3Federal Shipping(503) 555-9931

示例 “Employees” 表数据:

EmployeeIDLastNameFirstName
1DavolioNancy
2FullerAndrew
3LeverlingJanet
4PeacockMargaret
5BuchananSteven
6SuyamaMichael

SQL GROUP BY 示例:按发货人分组的订单数量

Section titled “SQL GROUP BY 示例:按发货人分组的订单数量”

要查找每个发货人处理的订单数量,我们按 ShipperName 分组并计数 OrderID:

SELECT S.ShipperName, COUNT(O.OrderID) AS NumberOfOrders
FROM Orders AS O
INNER JOIN Shippers AS S ON O.ShipperID = S.ShipperID
GROUP BY S.ShipperName
ORDER BY NumberOfOrders DESC;

此查询连接 Orders 和 Shippers 表,然后按发货人名称对结果分组,计算每个发货人的订单数量。最后,结果按数量排序。

GROUP BY 多列示例:按发货人和员工分组的订单数量

Section titled “GROUP BY 多列示例:按发货人和员工分组的订单数量”

您可以按多列分组以获得更细粒度的聚合。例如,要计算每个发货人为每个员工处理的订单数量:

SELECT S.ShipperName, E.LastName AS EmployeeLastName, COUNT(O.OrderID) AS NumberOfOrders
FROM Orders AS O
INNER JOIN Shippers AS S ON O.ShipperID = S.ShipperID
INNER JOIN Employees AS E ON O.EmployeeID = E.EmployeeID
GROUP BY S.ShipperName, E.LastName
ORDER BY S.ShipperName, NumberOfOrders DESC;

这将为 ShipperName 和 EmployeeLastName 的每个唯一组合创建组。

  • 对数据进行分类并计算每个类别的汇总统计信息(例如,按地区计算总销售额,按客户细分计算平均订单价值)。
  • 计算列中不同值的出现次数。
  • 为需要显示汇总信息的图表和报告准备数据。

要根据聚合函数的结果过滤这些组,您可以使用 HAVING 子句。