mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by

问题如下:

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘student.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

查看MySql的版本

select version();

查看sql_mode中的内容

select @@GLOBAL.sql_mode;

 原因:

mysql5.7 以上默认开启了only_full_group_by选项。我的版本是mysql5.7.27的

看一下group by的语法:

select 选取分组中的列+聚合函数 from 表名称 group by 分组的列 

从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。

我当前Mysql版本5.7.27,

再看一下ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列

必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。

解决办法有两种,第一种是临时解决,数据库重启还会重新出现此问题,第二种是修改mysql的配置文件

Windows解决办法:

方法1:
将查询到的sql_mode中ONLY_FULL_GROUP_BY删去即可,重启就会失效

set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';


方法2:
先找到自己mysql安装路径

select @@basedir;

然后进入文件夹找到自己的 my.ini 配置文件,修改 [mysqld] 中的内容,添加下面的内容就可以,然后退出数据库,在服务里面重启MySQL就可以

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Linux解决办法:

方法1:
将查询到的sql_mode中ONLY_FULL_GROUP_BY删去即可,重启就会失效

set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

方法2:
linux上的mysql 的配置文件不叫 my.ini,配置文件在 /etc/my.cnf 

vim /etc/my.cnf

修改 [mysqld] 中的内容,添加下面的内容就可以,然后重启MySQL就可以

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

 重启命令:

service mysql restart
原文地址:https://www.cnblogs.com/liyhbk/p/15649093.html