SQL必知会(二)-SQL查询篇(9)-分组数据

第10课、分组数据

1)创建分组

GROUP BY:分组
结合使用 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
2)过滤分组

HAVING:过滤分组

对每个分组进行过滤条件判断。

需求:检索两个以上订单的那些分组。

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

输出结果:

cust_id	orders
1000000001	2

结合 WHERE 子句和 HAVING 子句一起使用

需求:检索两个以上订单,并且要符合对应的产品价格大于等于4的供应商。

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

输出结果:

vend_id	num_prods
BRS01     	3
FNG01     	2

3)分组和排序

表10-1 ORDER BY 与 GROUP BY

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

--- 如果按照订购物品的数目排序输出,即按照 order_num 来排序
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

输出结果:

分组:
order_num	items
20006	3
20007	5
20008	5
20009	3

排序:
order_num	items
20006	3
20009	3
20007	5
20008	5

4)SELECT 子句顺序

表10-2 SELECT 子句及其顺序

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

总结

GROUP BY:分组

SELECT ... 聚集函数
FROM 表
GROUP BY 列;

-- 错误语法:
SELECT 列, 聚集函数
FROM 表;
(若出现SELECT 列 ,则要与 GROUP BY 列 搭配使用)

HAVING:过滤分组

SELECT ...聚集函数
FROM 表
GROUP BY 列
HAVING 过滤条件;

-- 1.先分组:GROUP BY 列
-- 2.后过滤分组:HAVING 过滤条件

GROUP BY,HAVING 和 WHERE 子句之间的区别:

对行进行过滤: WHERE

对行的某些字段进行分组: GROUP BY

对分组进行过滤: HAVING
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值