数据库学习笔记——10分组数据

2018-10-12  本文已影响0人  Love零O

主要学习GROUP BY子句和HAVING子句

1 数据分组

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

2 创建分组

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

group.jpg
GROUP BY子句指示DBMS按 vend_id 排序并分组数据。这样就会对每个vend_id而不是整个表计算num_prods一次。
GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。

通过相对位置指定列
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY 1

group_1.jpg

3 过滤分组

目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。HAVING支持所有的WHERE操作符。WHERE在数据分组前进行过滤,HAVING在数据后进行过滤。

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

having.png

例子:列出具有两个以上产品且其价格大于等于4的供应商:

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

filter.jpg

说明:使用HAVING和WHERE
HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。不过,使用HAVING时应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。

4 分组和排序

一般在使用GROUP BY子句时,应该也给出ORDER BY子句。

例子:检索包含3个及以上物品的订单号和订购物品的数目:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3

group_2.png
如果按订单物品的数量排序,需要添加ORDER BY子句,如下所示:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3 ORDER BY items,order_num
group_order.png

ORDER BY子句还可以写成ORDER BY COUNT(*),order_num或者ORDER BY 2,1


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

5 SELECT子句顺序

列举目前所学的SELECT语句中使用时必须遵循的次序。

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

猜你喜欢

热点阅读