![MySQL 8从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/737/26542737/b_26542737.jpg)
上QQ阅读APP看书,第一时间看更新
6.9 MySQL 8.0的新特性2——窗口函数
在MySQL 8.0版本之前,没有排名函数,所以当需要在查询当中实现排名时,必须手写@变量,比较麻烦。
在MySQL 8.0版本中,新增了一个窗口函数,用它可以实现很多新的查询方式。窗口函数类似于SUM()、COUNT()那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要GROUP BY的。
下面通过案例来讲述通过窗口函数实现排名效果的方法。
创建公司部门表branch,包含部门的名称和部门人数两个字段,创建语句如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/184.jpg?sign=1739025168-JQSaMKDIckPyj7Cbhc28xxnBaaCpqTKw-0-4c7d9d9d805c8afa806ecb7a0375b07c)
查询数据表branch中的数据:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/185.jpg?sign=1739025168-RjyaWdQz2ceCg7gs25ld9eFyd6Tza4Ai-0-0c02d7c12181e38cf0e18be5b59321db)
对公司部门人数按从小到大进行排名,可以利用窗口函数来实现:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/186.jpg?sign=1739025168-3qQDBhG7WA8hCF4trUAtPNpq3KbshizH-0-bbff942746d67e5e19d07a30a72112e8)
这里创建了名称为w1的窗口函数,规定对brcount字段进行排序,然后在SELECT子句中对窗口函数w1执行rank()方法,将结果输出为rank字段。
需要注意,这里的window w1是可选的。例如,在每一行中加入员工的总数,可以这样操作:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/187.jpg?sign=1739025168-W4Mw5ewkkST7D1kERv8R5Lw2CDCuT8hU-0-162f996feef4bdf85b3f61fff5f2f571)
可以一次性查询出每个部门的员工人数占总人数的百分比,查询结果如下:
![](https://epubservercos.yuewen.com/76103A/15056702904172406/epubprivate/OEBPS/Images/188.jpg?sign=1739025168-AYCjgESmwaCf4EOYBMSKljdZ6U5QiNtC-0-78f38026d63e97ff9b72e494dcc9da96)