按照教程。无法理解GROUP BY

时间:2015-03-18 17:10:07

标签: mysql sql group-by

我正在学习w3schools SQL教程,并且我在互联网上找不到一个我无法找到的问题。这是他们的代码:

SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID
GROUP BY ShipperName;

我不理解" GROUP BY"声明。如果我运行此SQL指令,则会显示包含3个出货单的结果集及其总订单数。但是,如果我删除最后一行(GROUP BY),则只显示显示的一个出货单,其中包含订单总数。

任何人都可以帮助我理解this lesson吗?

3 个答案:

答案 0 :(得分:2)

当您按列分组时,您向SQL Server指示每次分组列中的值更改时,重置其他聚合列的行为(计数,最大值,最小值等)。因此,从本质上讲,使用Group By语句,您会说“向我显示每个托运人的订单数量”。如果没有它,你会说“检索托运人,然后统计所有订单”。

至少对我有意思的是MySQL甚至在没有Group By子句的情况下运行查询。大多数引擎将拒绝包含聚合函数的查询而没有有效的Group By子句。

答案 1 :(得分:1)

如果查询包含aggregate functions但没有GROUP BY子句,MySQL会从所有选定的行创建一个组。

这是SQL标准的MySQL扩展,它在documentation

中进行了描述
  

如果在不包含GROUP BY子句的语句中使用组函数,则它等同于对所有行进行分组。有关更多信息,请参见第12.18.3节“MySQL Handling of GROUP BY”

答案 2 :(得分:1)

本教程中您一次做两件事。 GROUP BY -and- COUNT()。

让我们首先解决计数问题。您正在计算匹配的该列的实例。由于我们正在计算Orders.OrderID,因此我们获得与计数匹配的订单总数。当删除分组时,我们正在计算所有订单。由于您未从结果中删除Shippers.ShipperName列名,因此您将获得第一个匹配项。如果包含GROUP BY,我们将计算与该组匹配的订单。

其次是小组。分组时,您正在定义一列,每个唯一值都是一个组。由于Shippers.ShipperName表包含所有唯一的值,因此这些值成为我们的组。您可以删除COUNT(),但保留该组,它将返回您的三个组,对于订单数量,它将返回第一个匹配订单的orderID。删除COUNT()和GROUP BY时,结果是OrderID和ShipperName的列表。您基本上已将'ShipperID'转换为ShipperName。

当您同时拥有COUNT()和GROUP BY时,它会占用每个组,并计算属于该组的订单数量,因此能够告知请求该送货方式的订单数量。