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

时间:2019-02-12
阅读:

(一)报错: dW9免费资源网

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。 dW9免费资源网

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

(三)案例分析: dW9免费资源网

两张表:student 学生表和scores分数表 dW9免费资源网

student表字段: dW9免费资源网

编号    姓名    年龄     
CODE   NAME    AGE

scores表字段: dW9免费资源网

编号    学科      分数
CODE  SUBJECT   SCORE

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

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

(四)解决方案: dW9免费资源网

(1)调整SQL查询语句 dW9免费资源网

在GROUP BY后面加上查询出来的字段: dW9免费资源网

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 dW9免费资源网

用navcat打开数据库,执行SQL语句:select @@global.sql_mode,查询的值为: dW9免费资源网

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,重新设置值,执行: dW9免费资源网

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。 dW9免费资源网

返回顶部
顶部