第10课 分组数据

Posted zhangsonghui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第10课 分组数据相关的知识,希望对你有一定的参考价值。

第10课 分组数据

10.1 数据分组

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

10.2 创建分组

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

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

这就会对每个vend_id而不是整个表计算num_prods一次。

GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。

10.3 过滤分组

WHERE过滤行,而HAVING过滤分组。

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

说明:HAVING和WHERE的差别
这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

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

WHERE子句过滤所有prod_price至少为4的行,然后按vend_id分组数据,HAVING子句过滤计数为2或2以上的分组。

10.4 分组和排序

GROUP BY和ORDER BY经常完成相同的工作,但它们非常不同,理解这一点很重要。

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

要按订购物品的数目排序输出,需要添加ORDER BY子句,如下所示:

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

在这个例子中,使用GROUP BY子句按订单号(order_num列)分组数据,以便COUNT(*)函数能够返回每个订单中的物品数目。HAVING子句过滤数据,使得只返回包含三个或更多物品的订单。最后,用ORDER BY子句排序输出。

10.5 SELECT子句顺序

在SELECT语句中使用时必须遵循的次序,列出迄今为止所学过的子句。

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

10.6 小结

我们看到了如何使用HAVING子句过滤特定的组,还知道了ORDER BY和GROUP BY之间以及WHERE和HAVING之间的差异。


以上是关于第10课 分组数据的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1712 裸分组dp

第0课 - 数据结构引言

第10课 - 变量与函数的综合示例

如何用SQL SERVER取分组数据第一条

第0-0课 - 引言

第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考