语句本质:
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内容如下,以下语句根据此表进行查询:
1、适用group by的场景:出现函数如sum、max、avg、count,这种情况一般同时伴随着分组group by;
举例:
select dept,sum(salary) from tmp GROUP BY dept
反面案例【只有函数没加group by】:
select dept,sum(salary) from tmp
悲催了,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列只是随意显示一条数据,可说是毫无统计意义);
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
结果如下,显示所有数据
说明:不使用group by,与select后面全部列名均使用group by是一个效果的,均显示全部数据,但存在一个区别:不使用group by时会显示所有数据,包括完全重复的数据;使用group by+全部select列名后,如果这些列的内容恰好完全一致,则不会重复显示;