MySQL 5.7.5及以上版本实现了函数依赖检测。如果启用 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表、HAVING 条件或 ORDER BY 列表引用既未在 GROUP BY 子句中命名也不在功能上依赖于它们的非聚合列的查询。 (5.7.5之前,MySQL不检测函数依赖,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前行为的描述,请参阅MySQL 5.6参考手册。)
首先理解下分组是个什么概念,分组后可以达到什么样的效果; 分组是为了按组这个属性进行统计分析; 例如一个学生表中,按性别分组,可以统计出男生多少人,女生多少人。 在查询结果列中,必然是sum,count等聚合函数组成。例如: select count(*),sex from student group by sex; 如果是select * from user group by user_name;是想要得到一个什么样的统计结果呢? mysql5.6默认可以使用这种写法select * from user group by user_name,但实际上在内部对语句做过转换; mysql5.7以后默认不能使用此中写法,会报错。 所以写之前先想想我需要通过分组统计什么内容,使用适合的聚合函数
最详细的文档说明在官网上找到了。
来源:https://dev.mysql.com/doc/ref...
select中的字段需要在group by中强制写出来
select user_name from user group by user_name;
http://blog.csdn.net/u2830560...
首先理解下分组是个什么概念,分组后可以达到什么样的效果;
分组是为了按组这个属性进行统计分析;
例如一个学生表中,按性别分组,可以统计出男生多少人,女生多少人。
在查询结果列中,必然是sum,count等聚合函数组成。例如:
select count(*),sex from student group by sex;
如果是select * from user group by user_name;是想要得到一个什么样的统计结果呢?
mysql5.6默认可以使用这种写法select * from user group by user_name,但实际上在内部对语句做过转换;
mysql5.7以后默认不能使用此中写法,会报错。
所以写之前先想想我需要通过分组统计什么内容,使用适合的聚合函数
在SQL语句中使用GROUP BY要注意三点
1:不能使用别名;
2:除了函数字段,select中出现的字段都必须出现在group by中,
3:别名不能使用保留字
这三点MYSQL都是没有要求的!
我们再来看你这个语句,如果user表只有一个字段user_name ,那么这个语句没有问题,
如果user表有超过一个字段,那么这个语句在mysql是没有问题的,但是在oracle和sqlserver是有问题的
雷雷
如果存在user_name这个字段,那么就没有问题。group by是按字段分组,通常和聚合函数一起使用,像你这个sql也是可以执行的。只不过user_name通常都是唯一的,按唯一字段去分组是没有意义的。
这个属于mysql的特殊功能支持,如@xuexiphpa所说,可以通过参数关掉。
但不建议使用,group by分组后,理论上返回的记录数比分组前少了,一般会通过聚合函数来返回一些统计数据。
直接使用select *,就不确认返回的是那一条记录了。
一般个聚合函数结合用的比较多
group by聚合分组后,select子句中的元素最好只保持:
1、常数
2、group by指定的列名
3、聚合函数,如count()、avg()、sum(*)等等
你这样*的结果,只列出了每一个分组的一条记录,而且不知道是第一个还是是随机的一个值