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

    (一)报错: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。this


    (三)案例分析:code

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

        student表字段:io

编号    姓名    年龄     
CODE   NAME    AGE

        scores表字段:function

编号    学科      分数
CODE  SUBJECT   SCORE

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

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

    (四)解决方案:select

        (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。

相关文章
相关标签/搜索