当Group By跟上唯一主键或者唯一索引,ONLY |
您所在的位置:网站首页 › 主键一定有索引吗为什么 › 当Group By跟上唯一主键或者唯一索引,ONLY |
一、Group By 用法
基本用法: Group By 可以结合一些聚合函数(count,sum,avg,max,min) 对一列或者多列结果集进行分组。 基本格式如下: 按照学号+最高分,进行分组 select student_number,max(score) from achievement group by student_number;
以下测试,基于Mysql 5.7.29
报错原因是:only_full_group_by 查了一下mysql官方网站:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html 意思大概是:查询的字段,在进行分组的时候,都要出现在group by后面。 那为什么第一个测试可以成功? 官方解释是:当group by 后面跟上主键或者不为空唯一索引时,查询是有效的,因为此时的每一笔数据都具有唯一性。 注意:只有 mysql 5.7.5 之后的版本才有启用这个功能。 为了证明官方的这个说法,给student表添加一个student_birth 唯一不为空索引。 ALTER TABLE `student` ADD UNIQUE ( `student_birth` );然后再执行刚刚上面那个报错的语句 select student_number,student_birth from student group by student_birth;结果: 果然查询成功了 再执行一下分组: select student_number,student_birth from student group by student_birth;结果:果然普通索引无法执行成功 1. 当Group By 跟上主键或者唯一不为空索引时,其虽然能成功执行,但是其中分组效果是失效的或者说无意义,用官方的说法是:每一组都是唯一。 这也就告诫我们,为了分组而使用group by的时候,最好不要用主键或者唯一不为空索引进行分组。 2. Mysql 5.7.5以后的所有版本,都默认添加了only_full_group_by属性 -- 查看属性 SELECT @@sql_mode;所有查询的字段,在进行分组的时候,都要出现在group by后面,否则就会报错, 但是如果说group by 后面跟上主键或者唯一不为空索引时,可以允许这种查询语句存在,虽然查询结果意义不大。 -- mysql 5.7.5 之前版本,这种语法是正确的, -- mysql 5.7.5(包括自身)之后的版本是错误的,除非A是主键或者唯一索引 select A,B ... group by A;3. 当然可以通过关闭这个属性,或者查询语句时使用 any_value() 关键字。 怎么关闭(不推荐),但重启Mysql服务依然还会存在: set @@GLOBAL.sql_mode=''; set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';any_value(): select student_name,any_value(student_sex) from student group by student_name; |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |