情景再现

今天写sql时,遇到一个有趣的现象,如下图

group by时,只指定了name字段,而没有age字段,这在oracle中肯定是错误的,但是mysql却可以正常运行,并且有结果。


mysql 严格group by_mysql


group by的原理

不过,通过这个测试,我们也能大体知道group by的原理,用name字段分组,筛选数据,遇到第一条name=ade,分组中没有,添加ade,筛选第二条,name是ade,分组中已经有ade了,所以忽略掉。




group by不严格


虽然有结果,但是这样的group by是不严格的,通过查资料得知,可以设置sql_mode,当前的sql_mode是

mysql 严格group by_字段_02


要想严格group by,必须包含only_full_group_by

mysql 严格group by_mysql_03


设置严格group by后,我们再查询,你会发现查询的字段中如果不包含age,会报错。

mysql 严格group by_字段_04


参考资料

mysql sql_mode references


group by的原理

不过,通过这个测试,我们也能大体知道group by的原理,用name字段分组,筛选数据,遇到第一条name=ade,分组中没有,添加ade,筛选第二条,name是ade,分组中已经有ade了,所以忽略掉。