第10课 分组数据

这一课介绍如何分组数据,以便汇总表内容的子集。这涉及两个新SELECT子句:GROUP BY子句和HAVING子句。

数据分组

使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

创建分组

分组是使用SELECT语句的GROUP BY子句建立的。

SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;

GRUOP BY子句指示数据库系统按vend_id排序并分组数据。 GROUP BY子句指示数据库系统分组数据,然后对每个组而不是整个结果集进行聚集。意思是每个分组都单独进行COUNT()计算。

注意:GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

过滤分组,使用HAVING

HAVING子句类似WHERE。事实上,目前为止所学过的所有类别的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。

SELECT cust_id, COUNT() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >=2 ;

GROUP BY子句在HAVING之前。

HAVING和WHERE的差别:WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

SELECT vend_id, COUNT() AS num_prods FROM Products WHERE prod_price >=4 GROUP BY vend_id HAVING COUNT() >=2;

分组和排序

ORDER BYGROUP BY
对产生的输出排序对行分组,单输出可能不是分组的排序
任意列都可以使用(甚至非选择的列也可以)只可能使用选择列或表达式列,而且必须使用每个选择列的表达式
不一定需要如果与聚集函数一起使用列(或表达式),则必须使用

SELECT order_num, COUNT() AS items FROM OrderItems GROUP BY order_num HAVING COUNT() >=3;

SELECT order_num, COUNT() AS items FROM OrderItems GROUP BY order_num HAVING COUNT() >= 3 ORDER BY items, order_num;

SELECT子句顺序

子句说明是否必须使用
SELECT要返回的列或表达式
FROM从中检索数据的表仅在从表选择数据时使用
WHERE行级过滤
GROUP BY分组说明仅在按组计算聚集时使用
HAVING组级过滤
ORDER BY输出排序顺序