第10课 分组数据
这一课介绍如何分组数据,以便汇总表内容的子集。这涉及两个新SELECT语句子句:GROUP BY子句和HAVING子句。
10.1 数据分组
目前为止的所有计算都是在表的所有数据或匹配特定的WHERE子句的数据上进行的。而使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
10.2 创建分组
分组是使用SELECT语句的
GROUP BY子句建立的。eg.:
输入▼
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为计算字段(用COUNT(*)函数建立)。GROUP BY子句指示DBMS按vend_id排序并分组数据。这就会对每个vend_id而不是整个表计算num_prods一次。
10.3 过滤分组
SQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,你可能想要列出至少有两个订单的所有顾客。为此,必须基于完整的分组而不是个别的行进行过滤,这就要用到Having.
HAVING:Having非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,
WHERE过滤行,而
HAVING过滤分组
。
eg:
SELECT cust_id, COUNT(*) AS orders
FROM Order
GROUP BY cust_id
HAVING
COUNT(*) >= 2;
|
说明:HAVING和WHERE的差别
这里有另一种理解方法,
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
10.4 分组和排序
GROUP BY和ORDER BY经常完成相同的工作,但它们非常不同,理解这一点很重要。表10-1汇总了它们之间的差别。
表10-1 ORDER BY与GROUP BY
表10-1中列出的第一项差别极为重要。我们经常发现,用GROUP BY分组的数据确实是以分组顺序输出的。但并不总是这样,这不是SQL规范所要求的。
提示:不要忘记ORDER BY
一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。