数据分组允许您将所有数据划分为逻辑组,这使得可以在每个组中单独执行统计计算。
使用 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 列对数据进行分组。
正如我们过滤表中的行一样,我们可以过滤分组数据。为此,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件的组列表。
与正常的数据采样一样,我们可以在使用 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的子句即可。