问题如下:
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