- 参考资料
- 《MySQL必知必会(文字版)》
1、分组数据
1.1 分组
- 如果要返回每个供应商提供的产品数目,该怎么办?或者返回只提供一 项产品的供应商的产品,或者返回提供 10 个以上产品的供应商的产品, 怎么办?
- 使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
1.2 创建分组
- 分组是使用
SELECT
语句的GROUP BY
子句建立的
- vend_id 包含产品供应商的 ID,num_prods 为计算字段(用 COUNT(*)函数建立)。
- GROUP BY 子句指示DBMS 按 vend_id 排序并分组数据。
- 这就会对每个 vend_id 而不是整个表计算 num_prods 一次。
- 从输出中可以看到,供应商 BRS01 有 3 个产品,供应商 DLL01 有 4 个产品,而供应商 FNG01 有 2 个产品。
1.3 使用 GROUP BY 子句前的规则
1.4 过滤分组 - HAVING子句
WHERE
过滤行,而HAVING
过滤分组。
WHERE
在数据分组前进行过滤,HAVING
在数据分组后进行过滤。- 目前为止所学过的所有类型的
WHERE
子句都可以用HAVING
来替代。
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
- 最后一行增加了
HAVING
子句,它过滤COUNT(*) >= 2
(两个以上订单)的那些分组。
- 列出具有两个以上产品且其价格大于等于 4 的供应商
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
1.5 分组和排序
- 检索包含三个或更多物品的订单号和订购物品的数目:
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3;
- 要按订购物品的数目排序输出,需要添加
ORDER BY
子句
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;