天天看點

mysql 5.7 full_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。