今天被问到了一个问题
在MYSQL中使用GROUP BY分组时,我们可以select 多个非聚合字段,但是有些字段可能不在GROUP BY中,这样的SQL查询在SQL SERVER、ORACLE中是不合理的,且会报错,但mysql是可以通过,MYSQL的这种特异性,有时查询出来的结果并不是我们需要的。
下面我们来做一个实验
数据表如下:
id name tel
1 a a1
2 a a2
3 b b1
4 b b2
5 c c1
6 c c2
7 c c3
执行如下两个语句
1. select id,name,tel from test GROUP BY name
2. select max(id),name,tel from test GROUP BY name
在mysql中,上述语句都可以正确执行的,那么结果如何呢
1.的执行结果为
id name tel
1 a a1
3 b b1
5 c c1
2.的执行结果为
id name tel
2 a a1
4 b b1
7 c c1
结果很奇怪哈,为什么呢?
参考 这篇文章 https://blog.csdn.net/wxwzy738/article/details/20636563
我们知道,对于不加聚合函数的sql来说,它的功能结合了limit来得出结果,也就是刚才说的相当与先group by, 然后在每个group by下面进行limit 1。 所以上面的结果是根据得到的结果集然后根据每个group by 进行limit 1得到的结果。
也就是语句1是在对name进行group by后,对结果集执行limit 1
语句2 是对name进行group by 然后取得最大的id,然后对不包含聚合函数的字段执行limit 1