备战2022春招或暑期实习,本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。
本篇总结的是 《MySQL之group by》,后续会每日更新~
关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客
相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!目录
1、正文
2、正文
2.1 group by规则
2.2 group by使用
2.3 having使用
2.4 order by与limit
2.5 with rollup
1、正文
MySQL的group by用于对查询的数据进行分组;此外MySQL提供having子句对分组内的数据进行过滤。
MySQL提供了许多select子句关键字,它们在语句中的顺序如下所示:
2、正文
准备一张user表,其DDL和表数据如下所示2.1 group by规则
使用group by之前需要先了解group by使用的相关规则
group by子句置于where之后,order by子句之前
having 子句置于group by 之后,order by子句之前
group by子句中的每个列都必须是select的检索列或者有效表达式,不能使用聚集函数
select中使用的表达式,在group by子句中必须出现,并且不能使用别名
group by分组的数据中包含null值,null值被分为一组
group by子句可以嵌套,嵌套的分组在最后分组上汇总
2.2 group by使用
需求:
统计不同民族的用户数
语句:
2.3 having使用
对group by分组后的数据还需要再次过滤,就必须使用having子句。group by子句后使用where子句MySQL服务器会抛出异常
mysql> select nation, count(*) as nation_num from user group by nation where nation = '汉族'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where nation = '汉族'' at line 1mysql> select nation, count(*) as nation_num from user group by nation where nation = '汉族'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where nation = '汉族'' at line 1
mysql> select nation, count(*) as nation_num from user group by nation having nation != '汉族' order by nation_num desc; +----------+------------+ | nation | nation_num | +----------+------------+ | 维吾尔族 | 2 | | 回族 | 1 | | 蒙古族 | 1 | +----------+------------+ 3 rows in set (0.00 sec)
对于输出的结果需要指定返回的行数,可以使用limit,limit子句在整个语句的最后。
1.
mysql> select nation, count(*) as nation_num from user group by nation having nation != '汉族' order by nation_num desc limit 2; +----------+------------+ | nation | nation_num | +----------+------------+ | 维吾尔族 | 2 | | 回族 | 1 | +----------+------------+ 2 rows in set (0.00 sec)
2.5 with rollup
在group by子句中,WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
比如max():
mysql> select nation, max(height) as nation_num from user group by nation with rollup;+----------+------------+| nation | nation_num |+----------+------------+| 回族 | 175 || 汉族 | 184 || 维吾尔族 | 192 || 蒙古族 | 177 || NULL | 192 |+----------+------------+5 rows in set (0.00 sec)