编程、后端开发、面试的程序员、数据库、计算机软件、MySQL

吐槽

mysql的分组group by 在业务代码中使用非常频繁

我们来复习下

group by 含义

by后面跟指定的规则对数据进行分组,分组就是将一个“数据集”根据条件拆分若干“小数据集”,然后针对“小数据集”进行数据处理。

初始表数据

  • 表(一个职工表)



mysql去重合并字段 mysql去重group by_group by having用法


  • 数据


mysql去重合并字段 mysql去重group by_groupby函数_02


用法1(去重)

distinct 可以去重,其实group by 也是自带去重效果的

如下我根据条件(部门)去重,我看了下默认是每个部门的第一条数据

实际业务一般分组都会配合聚合函数使用


mysql去重合并字段 mysql去重group by_group by having用法_03


用法2(配合聚合函数)

配合聚合函数一起计算

常见的5个聚合函数sum,max,min,avg,count


mysql去重合并字段 mysql去重group by_distinct sql用法_04


  • 统计每个部门工资最高的结果


mysql去重合并字段 mysql去重group by_distinct sql用法_05


用法3(配合HAVING)


mysql去重合并字段 mysql去重group by_group by用法多个字段_06


求每部门最高工资的员工

group by 配合max能轻松求出每部门最高工资,

但是求最高工资的员工信息就需要2张表关联查询了


mysql去重合并字段 mysql去重group by_groupby函数_07


小白们切记不要以为这个SQL就是最终正确结果

除了salary、dept部门是正确的,其他字段是分组前默认第一条数据

所以如果你是顺序插入,到可以根据实际业务去1条SQL搞定(不推荐)。


mysql去重合并字段 mysql去重group by_distinct sql用法_08


正确写法join

join写法性能最佳

实际业务这个 dept必须是索引才可以


mysql去重合并字段 mysql去重group by_group by用法多个字段_09


查单张表求最大工资方法

这里我是根据工资从大到小顺序插入的,

group by 后查出来的就是最大工资(默认第一条数据)


mysql去重合并字段 mysql去重group by_distinct sql用法_10


group by 字段 ORDER BY null

order by null真可以提升性能,请见如下MySQL执行计划


mysql去重合并字段 mysql去重group by_group by having用法_11


group by 总结

  • 1 group by返回的数据是有序的,如果不想排序浪费资源可以后面跟 ORDER BY null,执行计划可能会少一个Using filesort
  • select 行(原则上只能是分组列或函数列),但由于版本问题,可能会输出第一行的其他字段数据
  • 配合聚合函数统计出来的

编程、后端开发、面试的程序员、数据库、计算机软件、MySQL