Mysql中,下面这样的写法是可以允许的。但是严不严谨,支不支持这样写?有疑惑过不去这个坎,请大家帮忙看看。
select * from user group by user_name;
Mysql中,下面这样的写法是可以允许的。但是严不严谨,支不支持这样写?有疑惑过不去这个坎,请大家帮忙看看。
select * from user group by user_name;
select中的字段需要在group by中强制写出来
select user_name from user group by user_name;
首先理解下分组是个什么概念,分组后可以达到什么样的效果;
分组是为了按组这个属性进行统计分析;
例如一个学生表中,按性别分组,可以统计出男生多少人,女生多少人。
在查询结果列中,必然是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是有问题的
select * from user group by user_name;
//这么写其实也没问题 但是 实际上 你使用 group by 的时候 你需要用的 就只有 user_name 这个字段吧(通常来说)
//用什么字段就取什么字段就好。不一定要用 ‘*’ 用谁取谁就好
如果存在user_name这个字段,那么就没有问题。group by是按字段分组,通常和聚合函数一起使用,像你这个sql也是可以执行的。只不过user_name通常都是唯一的,按唯一字段去分组是没有意义的。
这个属于mysql的特殊功能支持,如@xuexiphpa所说,可以通过参数关掉。
但不建议使用,group by分组后,理论上返回的记录数比分组前少了,一般会通过聚合函数来返回一些统计数据。
直接使用select *,就不确认返回的是那一条记录了。
group by聚合分组后,select子句中的元素最好只保持:
1、常数
2、group by指定的列名
3、聚合函数,如count()、avg()、sum(*)等等
你这样*的结果,只列出了每一个分组的一条记录,而且不知道是第一个还是是随机的一个值
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.2k 阅读✓ 已解决
3 回答2k 阅读
2 回答1.8k 阅读
最详细的文档说明在官网找到了。
来源:https://dev.mysql.com/doc/ref...