先上例子
表数据如图
1.group by后只跟一个字段
2.跟2个字段
3.调换位置
理解
先说说之前的困惑。
“表示根据后面的字段来分组,如果只有1个字段,那只是根据这个字段的值来进行一次分组就可以了;若后面有多个字段,那表示根据多字段的值来进行层次分组,知分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中,再根据第2个字段的值进行分组;接道着第2个字段值相同的记录中,再根据第3个字段的值进行分组…依次类推。”
如上是之前刚接触group by的时候一直看到的解释。当时不理解为什么老是说先按第一个字段分组,再按第二个字段分组。因为从直观结果来看就是group by后面的字段全部一样时,才会分到一个组里面,没有什么先后之分,结果都是一样的,后面的字段都要计入分组规则。
从1和2的结果我们可以看到确实是先把name进行了分组,从2的结果中id=8数据到了第二行,而不是最后一行,就可以得出这个结论了。我想上面一直说的先后顺序,指的是数据库在进行分组的实际运行流程,是通过这个流程来实现了最终group by后面的字段都计入分组规则的需求。
通过3来验证,可以看到,先把age分了组,然后再从age一样的组中分出name一样的组。
再者,通过这种方式实现的分组。有点类似于excel表格展示数据的方式一样的在一块儿,可以合并单元格。比如2里面第一列的3个a。