第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 BY | GROUP 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