这一课介绍如何分组数据,以便汇总表内容的子集。这涉及两个新 SELECT语句子句:GROUP BY子句和HAVING子句。
10.1数据分组
从上一课得知,使用SQL聚集函数可以汇总数据。这样,我们就能够
对行进行计数,计算和与平均数,不检索所有数据就获得最大值和最 小值。
目前为止的所有计算都是在表的所有数据或匹配特定的WHERE子句的数
据上进行的。比如下面的例子返回供应商DLL01提供的产品数目:
输入▼
SELECT COUNT。*) AS num_prods
FROM Products
WHERE vend_id =
'DLL01';
输出▼
num_prods
4
如果要返回每个供应商提供的产品数目,该怎么办?或者返回只提供一 项产品的供应商的产品,或者返回提供10个以上产品的供应商的产品,
怎么办?
这就是分组大显身手的时候了。使用分组可以将数据分为多个逻辑组, 对每个组进行聚集计算。
10.2创建分组
分组是使用SELECT语句的GROUP
BY子句建立的。理解分组的最好办法 是看一个例子:
输入▼
SELECT vend_id, COUNT(-) AS num_prods
FROM Products
GROUP
BY vend_id;
输出▼
|
vend_id |
num_prods |
|
BRS01 |
3 |
|
DLL01 |
4 |
|
FNG01 |
2 |
|
分析▼ |
|
上面的SELECT语句指定了两个列:vend.id包含产品供应商的ID, num_prods为计算字段(用COUNTC?)函数建立)。GROUP
BY子句指示 DBMS按vend-i d排序并分组数据。这就会对每个vend_i
d而不是整个 表计算num_prods 一次。从输出中可以看到,供应商BRSO1有3个产 品,供应商DLLO1有4个产品,而供应商FNGO1有2个产品。
因为使用了 GROUP BY,就不必指定要计算和估值的每个组了。系统会自 动完成。GROUP BY子句指示DBMS分组数据,然后对每个组而不是整 个结果集进行聚集。
在使用GROUP BY子句前,需要知道一些重要的规定。
口 GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,
更细致地进行数据分组。
口如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进 行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以
不能从个别的列取回数据)。
口
GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但
不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY 子句中指定相同的表达式。不能使用别名。
口大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文 本或备注型字段)。
口除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句 中给出。
口如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。 如果列中有多行NULL值,它们将分为一组。
口 GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
提示:ALL子句
Microsoft SQL
Server等有些SQL实现在GROUP BY中支持可选的ALL 子句。这个子句可用来返回所有分组,即使是没有匹配行的分组也返 回(在此情况下,聚集将返回NULL)。具体的DBMS是否支持ALL, 请参阅相应的文档。
有的SQL实现允许根据SELECT列表中的位置指定GROUP BY的列。 例如,GROUP BY 2,
1可表示按选择的第二个列分组,然后再按第一 个列分组。虽然这种速记语法很方便,但并非所有SQL实现都支持, 并且使用它容易在编辑SQL语句时出错。




