13.1数据分组
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
13.2创建分组
输入 SELECT vend_id,COUNT(*) AS num_prods FROM proucts GROUP BY vend_id;
分析 上面的SELECT语句指定了两个列,vend_id包含产品供应商的ID,num_prods为计算字段。GROUP BY 子句指示MySQL按vendid排序并分组数据。
使用GROUP BY子句的一些规则:
- GROUP BY子句可以包含任意数目的列。GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里,即现以X分组然后以Y分组。
- GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。如果在 SELECT 中使用表达式, 则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
- 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
使用WITH ROLLUP关键字可以汇总分组的所有值,例如,下述语句得到所有分组count(*)的和14:
select vend_id, count(*) as num_prods from products group by vend_id with rollup;
![](https://i-blog.csdnimg.cn/blog_migrate/ba67b3f6e9176403a4cdcf1134838dfa.png)
13.3 过滤分组
注意:HAVING非常类似于WHERE,唯一的差别是 WHERE过滤行,而HAVING过滤分组。HAVING支持所有WHERE操作符。
输入:
SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
分析 HAVING子句,他过滤 count(*)>=2的那些分组
另一种理解方法:HAVING用于分组后过滤,WHERE用于分组前过滤
13.4 分组和排序
注意:使用GROUP BY子句时,应该也给出ORDER BY子句,来确保数据正确排序,而不能仅依赖GROUP BY自身的默认排序。
13.5SELECT子句顺序
![](https://i-blog.csdnimg.cn/blog_migrate/6f8c906c398070cbcb4b1c6c14e6a8df.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7daf4477b163d8dba5e4af5aa0a25c7f.png)
13.6小结
本章讲授了如何使用GROUP BY子句对数据组进行这些汇总计算,返回每个组的结果。