SQL Group By
SQL GROUP BY 语句
Section titled “SQL GROUP BY 语句”SQL 中的 GROUP BY 语句用于将相同的数据排列成组。它几乎总是与聚合函数(如 COUNT()、SUM()、AVG()、MAX()、MIN())结合使用,以计算每个组的度量。
GROUP BY 语句解释
Section titled “GROUP BY 语句解释”GROUP BY 语句将一个或多个指定列中具有相同值的行分组为一个汇总行。对于每个组,您可以应用聚合函数来计算汇总统计信息。
一个关键规则:使用 GROUP BY 时,SELECT 列表中任何不属于聚合函数的列都必须包含在 GROUP BY 子句中。这确保了结果集中的每一行都对应一个唯一的组。
SQL GROUP BY 语法
Section titled “SQL 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, …;
逻辑执行顺序:
理解逻辑处理顺序有助于编写复杂的查询:
FROM(和JOIN):指定表。WHERE:在分组前过滤单行。GROUP BY:基于指定列对行分组。HAVING:过滤GROUP BY创建的组(类似于WHERE,但针对组)。SELECT:选择列并应用聚合函数。DISTINCT:从结果中移除重复行。ORDER BY:对最终结果集排序。LIMIT/OFFSET/TOP:限制返回的行数。
在本教程中,我们将使用受 Northwind 示例数据库启发的概念性表。假设我们有 “Orders”、“Shippers” 和 “Employees” 表。
示例 “Orders” 表数据:
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10248 | 90 | 5 | 1996-07-04 | 3 |
| 10249 | 81 | 6 | 1996-07-05 | 1 |
| 10250 | 34 | 4 | 1996-07-08 | 2 |
| 10251 | 84 | 3 | 1996-07-08 | 1 |
| 10252 | 76 | 4 | 1996-07-09 | 2 |
示例 “Shippers” 表数据:
| ShipperID | ShipperName | Phone |
|---|---|---|
| 1 | Speedy Express | (503) 555-9831 |
| 2 | United Package | (503) 555-3199 |
| 3 | Federal Shipping | (503) 555-9931 |
示例 “Employees” 表数据:
| EmployeeID | LastName | FirstName |
|---|---|---|
| 1 | Davolio | Nancy |
| 2 | Fuller | Andrew |
| 3 | Leverling | Janet |
| 4 | Peacock | Margaret |
| 5 | Buchanan | Steven |
| 6 | Suyama | Michael |
SQL GROUP BY 示例:按发货人分组的订单数量
Section titled “SQL GROUP BY 示例:按发货人分组的订单数量”要查找每个发货人处理的订单数量,我们按 ShipperName 分组并计数 OrderID:
SELECT S.ShipperName, COUNT(O.OrderID) AS NumberOfOrdersFROM Orders AS OINNER JOIN Shippers AS S ON O.ShipperID = S.ShipperIDGROUP BY S.ShipperNameORDER BY NumberOfOrders DESC;此查询连接 Orders 和 Shippers 表,然后按发货人名称对结果分组,计算每个发货人的订单数量。最后,结果按数量排序。
GROUP BY 多列示例:按发货人和员工分组的订单数量
Section titled “GROUP BY 多列示例:按发货人和员工分组的订单数量”您可以按多列分组以获得更细粒度的聚合。例如,要计算每个发货人为每个员工处理的订单数量:
SELECT S.ShipperName, E.LastName AS EmployeeLastName, COUNT(O.OrderID) AS NumberOfOrdersFROM Orders AS OINNER JOIN Shippers AS S ON O.ShipperID = S.ShipperIDINNER JOIN Employees AS E ON O.EmployeeID = E.EmployeeIDGROUP BY S.ShipperName, E.LastNameORDER BY S.ShipperName, NumberOfOrders DESC;这将为 ShipperName 和 EmployeeLastName 的每个唯一组合创建组。
何时使用 GROUP BY:
Section titled “何时使用 GROUP BY:”- 对数据进行分类并计算每个类别的汇总统计信息(例如,按地区计算总销售额,按客户细分计算平均订单价值)。
- 计算列中不同值的出现次数。
- 为需要显示汇总信息的图表和报告准备数据。
要根据聚合函数的结果过滤这些组,您可以使用 HAVING 子句。