mysql5.7.5及以上:ONLY_FULL_GROUP_BY SQL模式报错

来自:网络
时间:2019-02-12
阅读:

(一)报错:

Expression #2 of SELECT list is not in GROUP BY clause and contAIns nonaggregated column ‘...’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。

(二) 问题出现的原因: 
       MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。

(三)案例分析:

两张表:student 学生表和scores分数表

student表字段:

编号    姓名    年龄     
CODE   NAME    AGE

scores表字段:

编号    学科      分数
CODE  SUBJECT   SCORE

需求是:根据学生所有学科的总分数进行排名,则常规的写法如下,根据两张表关联字段CODE进行查询,但在MYSQL5.75版本及以上的会报错:

SELECT
   s1.CODE,
   s1.NAME,
   s1.AGE,
   sum(SCORE) as ALLSCORE
FROM student s1
LEFT JOIN scores s2
ON s1.CODE = s2.CODE
GROUP BY CODE
ORDER BY ALLSCORE DESC

(四)解决方案:

(1)调整SQL查询语句

在GROUP BY后面加上查询出来的字段:

SELECT
   s1.CODE,
   s1.NAME,
   s1.AGE,
   sum(SCORE) as ALLSCORE
FROM student s1
LEFT JOIN scores s2
ON s1.CODE = s2.CODE
GROUP BY CODE,NAME,AGE
ORDER BY ALLSCORE DESC

(2)去掉ONLY_FULL_GROUP_BY

用navcat打开数据库,执行SQL语句:select @@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

去掉ONLY_FULL_GROUP_BY,重新设置值,执行:

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。

返回顶部
顶部