问题原因
出现这个问题主要是因为MySQL5.7默认开启的SQL校验中有ONLY_FULL_GROUP_BY。
在此模式下,如果使用了group by进行查询,那么select所查询的列只能是以下几种情况:
- group by后面的。
- SUM、MAX、MIN等聚合函数。
也就是说,对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
如果使用select name from student group by age;
这种语句就会报错。
即使表中可能根据age分组以后并没有重复的name值,但是也会报错。
解决方法
临时解决,重启MySQL失效
先查询当前的sql_mode;
使用select @@sql_mode
查询并复制当前值,将其中的ONLY_FULL_GROUP_BY
去掉,然后使用set global sql_mode='新值'
进行设置(同理,set session sql_mode
设置为当前会话生效)
修改配置文件,永久生效
修改my.cnf文件(一般在安装目录下,如果使用yum安装可能是/etc/my.cnf,windows系统中为my.ini)
在其中[mysqld]
下,修改或增加一行sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
此处的配置也可根据上面的select @@sql_mode
的值来定,根据实际场景进行修改即可。
说明
如果遇到生产环境不可以重启MySQL,可以同时采用上述两种方法,先临时生效,再等重启后永久生效。