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

    (一)报错:

        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。

文章来源:

Author:海岸线的曙光
link:https://my.oschina.net/u/3747963/blog/1786061