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。

相關文章
相關標籤/搜索