1、我在云服务器安装MySQL5.7,用group by 查询时抛出如下异常:
Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
2、查了原因是因为:
从MySQL 5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL不会检测到功能依赖性,并且默认情况下未启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见《 MySQL 5.6参考手册》。)
MySQL对标准SQL的扩展允许在HAVING子句中引用选择列表中的别名表达式。在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY会禁用此扩展,因此要求使用无别名表达式编写HAVING子句。从MySQL 5.7.5开始,取消了此限制,以便HAVING子句可以引用别名,而不管是否启用了ONLY_FULL_GROUP_BY。
在云服务器上登录mysql,命令行输入:mysql -uroot -p
[root@root~]# mysql -uroot -p
输入密码后,按下回车键即可。出现以下界面表示登录成功!
执行以下个命令,可以查看 sql_mode 的内容。
mysql> SHOW GLOBAL VARIABLES;
mysql> SHOW SESSION VARIABLES;
mysql> select @@sql_mode;
前两句可以发现session和global 的sql_mode的值都为:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
输入这个select @@sql_mode; 出现这个界面:
3、解决办法
在登录mysql的状态下执行以下两个语句:
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
输入这两个命令,就可以去掉 sql_mode 的 ONLY_FULL_GROUP_BY了,这样问题就解决啦。