语句本质:

group by的本质就是将某些列分组,将分组后的每组数据进行函数运算,如sum、max、avg、count等,得出每组最终结果;

展示:1)所有分组的列都需要展示出来  2)函数运算结果展示出来;

由于语句本质如此,语法见下述描述;

语法:

  • group by+列名,代表根据此列进行分组;
  • group by语句一般都同时使用函数sum、max、avg、count等,意为根据分组进行函数计算;两者(group by与函数)一般成对出现;
  • group by其后应该为select的所有的列,除非某些列比较特殊;
  • 也可不使用group by,此时查询结果为所有数据;

转换为简易版个人总结的规律:

1)先判断是否需要使用group by

2)如果需要,再判断哪些列需要group by

以下为规则与举例:

数据表tmp内容如下,以下语句根据此表进行查询:

BY GROUP mysql 改动 mysql使用group by_字段

1、适用group by的场景:出现函数如sum、max、avg、count,这种情况一般同时伴随着分组group by;

举例:
select dept,sum(salary) from tmp GROUP BY dept

BY GROUP mysql 改动 mysql使用group by_字段_02

反面案例【只有函数没加group by】:

select dept,sum(salary) from tmp

BY GROUP mysql 改动 mysql使用group by_数据_03

悲催了,sum(salary)计算所有部门总的薪水了,dept列仅随意展示某个部门,没有意义;

说明:

1)select的所有列均需要通过group by进行分组,但不包含函数作用列;

类似如下语句select dept,max(salary) from tmp GROUP BY dept,不需要group by salary,因为语句含义即为根据dept来计算salary;

2)如果存在某个列在select中却不使用group by分组,则此列会任意显示值,没有统计意义

反面举例(某个列在select后但未group by):

select dept,name from tmp GROUP BY dept

结果如下,name列在select中但是未group by,因此结果只是取了dept下的任意name,显示意义不大(此处仅举了最简单的例子,如果有复杂例子你会发现,类似这种name列只是随意显示一条数据,可说是毫无统计意义);

BY GROUP mysql 改动 mysql使用group by_BY GROUP mysql 改动_04

 

3)以下情况为特殊情况,可以存在某个列在select中却不使用group by分组:

  • 与group by的其他列属性一致,如已经根据人员唯一的account分组了,就不需要根据人员name分组了;增加上group by name也可以,只是没有必要;
  • 相同表在左连接时起了不同的别名变为2张表且这2张表调用了同一个字段,只需要group by这2张表的任意一个表和字段即可,不需要2张表均group by,否则重复了;
  • 包含在group by的某列中,如已经根据date(年月日)分组了,就不再需要根据month(年月)分组了(date中包含month);增加上group by month也可以,只是没有必要;
  • 函数作用列,如sum、max、avg、count等函数作用的列;

2、不适用group by的场景:查询后显示所有数据,且没有分组需要;

举例:

select dept,name from tmp

结果如下,显示所有数据

BY GROUP mysql 改动 mysql使用group by_数据_05

说明:不使用group by,与select后面全部列名均使用group by是一个效果的,均显示全部数据,但存在一个区别:不使用group by时会显示所有数据,包括完全重复的数据;使用group by+全部select列名后,如果这些列的内容恰好完全一致,则不会重复显示;