你的浏览器不支持canvas

Enjoy life!

数据库-SQL(五)分组数据

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

  • 参考资料
    • 《MySQL必知必会(文字版)》

1、分组数据

1.1 分组

  • 如果要返回每个供应商提供的产品数目,该怎么办?或者返回只提供一 项产品的供应商的产品,或者返回提供 10 个以上产品的供应商的产品, 怎么办?
  • 使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

1.2 创建分组

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

select

  • 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 子句前的规则

select

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(两个以上订单)的那些分组。

select


  • 列出具有两个以上产品且其价格大于等于 4 的供应商
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2; 

select

1.5 分组和排序

select

  • 检索包含三个或更多物品的订单号和订购物品的数目:
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3; 

select


  • 要按订购物品的数目排序输出,需要添加 ORDER BY 子句
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num; 

select

1.6 SELECT 子句顺序

select


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。