TOP

SQL-第 8 课:数据分组 (GROUP BY)

YouLibreCalc for Excel logo

数据分组允许您将所有数据划分为逻辑组,这使得可以在每个组中单独执行统计计算。


1. 创建组(GROUP BY)

使用 SELECT 运算符的 GROUP BY 语句创建组。让我们考虑一个例子。

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

根据此请求,我们提取了每个月销售的产品数量信息。运算符 SELECT 命令输出两列 Product - 产品名称和 Product_num - 我们创建的用于显示已售产品数量的计算字段(字段公式 SUM(Quantity))。 GROUP BY 子句告诉 DBMS 按 Product 列对数据进行分组。

还值得注意的是,GROUP BY 必须位于 WHERE 子句之后、ORDER BY 之前。

2. 过滤组(HAVING)

正如我们过滤表中的行一样,我们可以过滤分组数据。为此,SQL 中有 HAVING 运算符。让我们以前面的示例为例,添加组过滤。

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

我们看到,在计算出每种产品的销售数量后,DBMS“砍掉”了那些销售量低于 4,000 件的产品。

如您所见, HAVING 运算符与 WHERE 运算符非常相似,但它们之间存在显着差异: WHERE 在分组之前过滤数据,而 HAVING 在分组之后过滤。因此,由 WHERE 子句删除的行将不会包含在该组中。因此,WHERE 和 HAVING 运算符可以在同一句子中使用。考虑一个例子:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

我们将 WHERE 运算符添加到前面的示例中,其中我们指定了产品“Skis Long”,这反过来又影响了 HAVING 运算符的分组。结果我们可以看到,“Skis Long”这个产品并没有进入销量超过4000件的组列表。

3. 分组与排序

与正常的数据采样一样,我们可以在使用 HAVING 运算符分组后对组进行排序。为此,我们可以使用已经熟悉的运算符 ORDER BY。在这种情况下,其应用与前面的示例类似。例子:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

或者简单地按照我们想要排序的顺序指定字段编号:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

我们看到,为了对汇总结果进行排序,我们只需要在运算符HAVING之后编写带有ORDER BY的子句即可。

MS Access 不支持按列别名对组进行排序,也就是说,在我们的示例中,要对值进行排序,我们将无法在查询末尾写入 ORDER BY Product_num。