编程、后端开发、面试的程序员、数据库、计算机软件、MySQL
吐槽
mysql的分组group by 在业务代码中使用非常频繁
我们来复习下
group by 含义
by后面跟指定的规则对数据进行分组,分组就是将一个“数据集”根据条件拆分若干“小数据集”,然后针对“小数据集”进行数据处理。
初始表数据
- 表(一个职工表)
![a4b27172f2959b7bc77efada867409ef.png](https://img-blog.csdnimg.cn/img_convert/a4b27172f2959b7bc77efada867409ef.png)
- 数据
![8a15c28dba315e40ecc5f93f69937604.png](https://img-blog.csdnimg.cn/img_convert/8a15c28dba315e40ecc5f93f69937604.png)
用法1(去重)
distinct 可以去重,其实group by 也是自带去重效果的
如下我根据条件(部门)去重,我看了下默认是每个部门的第一条数据
实际业务一般分组都会配合聚合函数使用
![867dc68ed50fe2c7210e965d35ee01da.png](https://img-blog.csdnimg.cn/img_convert/867dc68ed50fe2c7210e965d35ee01da.png)
用法2(配合聚合函数)
配合聚合函数一起计算
常见的5个聚合函数sum,max,min,avg,count
![1830cafbba8d90e14284ca36c8c79e11.png](https://img-blog.csdnimg.cn/img_convert/1830cafbba8d90e14284ca36c8c79e11.png)
- 统计每个部门工资最高的结果
![73fdedb5fe1e57674ed809e73f594d72.png](https://img-blog.csdnimg.cn/img_convert/73fdedb5fe1e57674ed809e73f594d72.png)
用法3(配合HAVING)
![f98d8df5bdd618df38b50eb2cbf79096.png](https://img-blog.csdnimg.cn/img_convert/f98d8df5bdd618df38b50eb2cbf79096.png)
求每部门最高工资的员工
group by 配合max能轻松求出每部门最高工资,
但是求最高工资的员工信息就需要2张表关联查询了
![0cd052a72eb0565681fbafba05f32c65.png](https://img-blog.csdnimg.cn/img_convert/0cd052a72eb0565681fbafba05f32c65.png)
小白们切记不要以为这个SQL就是最终正确结果
除了salary、dept部门是正确的,其他字段是分组前默认第一条数据,
所以如果你是顺序插入,到可以根据实际业务去1条SQL搞定(不推荐)。
![bfbd2d5a8e2680e36bf1b916d9ef2b86.png](https://img-blog.csdnimg.cn/img_convert/bfbd2d5a8e2680e36bf1b916d9ef2b86.png)
正确写法join
join写法性能最佳
实际业务这个 dept必须是索引才可以
![38c100b00a7d8edb09dd6a0b6246e9a6.png](https://img-blog.csdnimg.cn/img_convert/38c100b00a7d8edb09dd6a0b6246e9a6.png)
查单张表求最大工资方法
这里我是根据工资从大到小顺序插入的,
group by 后查出来的就是最大工资(默认第一条数据)
![5d7d33ff204e97cc4678e7a75a826f5c.png](https://img-blog.csdnimg.cn/img_convert/5d7d33ff204e97cc4678e7a75a826f5c.png)
group by 字段 ORDER BY null
order by null真可以提升性能,请见如下MySQL执行计划
![6f2e42e6157ff1c38dd7ae41131311cb.png](https://img-blog.csdnimg.cn/img_convert/6f2e42e6157ff1c38dd7ae41131311cb.png)
group by 总结
- 1 group by返回的数据是有序的,如果不想排序浪费资源可以后面跟 ORDER BY null,执行计划可能会少一个Using filesort
- select 行(原则上只能是分组列或函数列),但由于版本问题,可能会输出第一行的其他字段数据
- 配合聚合函数统计出来的
编程、后端开发、面试的程序员、数据库、计算机软件、MySQL