ONLY_FULL_GROUP_BY 牛皮癣怎么治
这个问题出现在MySQL5.7版本之上,问题核心解决就是修改配置内容,一个是修改文件,一个是通过sql来修改,去掉 ONLY_FULL_GROUP_BY
网上太多的介绍,但是我试了一圈没一个成功,除了一个人,讲的还不错。https://blog.csdn.net/Abysscarry/article/details/79468411
1。在mysql命令行输入:select @@sql_mode 查询当前数据库的默认sql_mode:
ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
简而言之,就是SELECT后面接的列必须被GROUP BY后面接的列所包含。如:
select a,b from table group by a,b,c; (正确)
select a,b,c from table group by a,b; (错误)
这个配置会使得GROUP BY语句环境变得十分狭窄,所以一般都不加这个配置
在MySQL命令行下,更改全局设置,对于新建的数据库有效:
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';
对于已经存在的数据库,则要在数据库(如MySQL Workbench)命令行下执行:
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';
或者下面这句:(去掉NO_AUTO_CREATE_USER)
set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
举例子,ONLY_FULL_GROUP_BY的影响:
正常情况下没有配置
select count(id) from table_demo order by rank -- ok
select count(id) from table_demo group by rank -- ok
select count(rank),id from table_demo group by rank -- ok
select count(rank),id from table_demo group by id -- ok
如果配置了ONLY_FULL_GROUP_BY
select count(id) from table_demo order by rank -- error
select count(id) from table_demo group by rank -- ok
select count(rank),id from table_demo group by rank -- error
select count(rank),id from table_demo group by id -- ok
如果配置了ONLY_FULL_GROUP_BY,后面不能加order by
如果使用了聚合函数,查询的字段还包括其他的字段,就需要使用group by,就跟oracle相似