MySQL報錯Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
解決MySQL5.7版本之后使用GROUP BY語句時報錯
今天使用mysql簡單的一句分組查詢語句(GROUP BY)報錯了。
mysql> SELECT * FROM tb GROUP BY empid;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db1.tb.sales' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
查了問題原因和解決方法,成功解決。
問題原因
原因:
- 使用GROUP BY 語句違背了sql_mode=only_full_group_by。
- 因為mysql版本5.7之后默認的模式是ONLY_FULL_GROUP_BY。
官網(wǎng)文檔的原話:
說人話,大概意思就是說(使用google翻譯):
拒絕選擇列表、HAVING 條件或 ORDER BY 列表引用非聚合列的查詢,這些列既不在 GROUP BY 子句中命名,也不在功能上依賴于(唯一確定的)GROUP BY 列。
從 MySQL 5.7.5 開始,默認 SQL 模式包括 ONLY_FULL_GROUP_BY。(在 5.7.5 之前,MySQL 不檢測函數(shù)依賴,并且默認不啟用 ONLY_FULL_GROUP_BY。有關 5.7.5 之前的行為的描述,請參閱 MySQL 5.6 參考手冊。)
標準 SQL 的 MySQL 擴展允許在 HAVING 子句中引用選擇列表中的別名表達式。 在 MySQL 5.7.5 之前,啟用 ONLY_FULL_GROUP_BY 會禁用此擴展,因此需要使用非別名表達式編寫 HAVING 子句。 從 MySQL 5.7.5 開始,此限制被取消,因此 HAVING 子句可以引用別名,無論是否啟用了 ONLY_FULL_GROUP_BY。
解決方法
1、先使用SQL查詢sql_mode
select @@global.sql_mode
2、重新設置sql_mode,刪除ONLY_FULL_GROUP_BY
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
3、退出重進
# 退出 quit # 再次登錄(命令行模式) mysql -u root -p
再次執(zhí)行查詢語句,
SELECT * FROM tb GROUP BY empid;
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Ubuntu下啟動、停止、重啟MySQL,查看錯誤日志命令大全
這篇文章主要介紹了Ubuntu下啟動、停止、重啟MySQL,查看錯誤日志命令大全,需要的朋友可以參考下2014-06-06mysql中key 、primary key 、unique key 與index區(qū)別
這篇文章主要介紹了mysql中key 、primary key 、unique key 與index區(qū)別的相關資料,需要的朋友可以參考下2016-10-10Centos 6.4源碼安裝mysql-5.6.28.tar.gz教程
這篇文章主要為大家詳細介紹了Centos 6.4源碼安裝mysql-5.6.28.tar.gz教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Mysql TIMESTAMPDIFF函數(shù)示例詳解
這篇文章主要介紹了Mysql TIMESTAMPDIFF函數(shù)示例詳解,TIMESTAMPDIFF函數(shù)返回datetime_expr2 - datetime_expr1的結果,其中datetime_expr1和datetime_expr2可以是DATE或DATETIME類型值,本文給大家詳細講解,需要的朋友可以參考下2023-03-03Ubuntu10下如何搭建MySQL Proxy讀寫分離探討
MySQL Proxy是一個處于你的Client端和MySQL server端之間的簡單程序,它可以監(jiān)測、分析或改變它們的通信2012-11-11