日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column

發(fā)布時間:2024/7/23 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

mysql報錯:

[Err] 1055 - Expression #5 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

分析

發(fā)生這個錯誤,一般是sql不規(guī)范,出現(xiàn)類似下列寫法導致的:
select a字段,b字段 from 表 group by b字段

可以看到,明明按照b字段分組的,卻想查出a字段,當然,mysql5.7.5版本之前,由于沒有對這種做嚴格校驗,所以如果剛好每組b字段都有相同的a字段,也是能查出來的,所以給了很多人一個錯覺,就是覺得這樣寫也是沒問題的,包括我之前也是這樣認為的,汗顏。

但今天發(fā)現(xiàn)這個問題,卻發(fā)現(xiàn)網(wǎng)友給出的解決方案,更是粗糙的不行。
一般網(wǎng)上搜到的解決方案是:

不啟用ONLY_FULL_GROUP_BY,也就是不檢測這種功能依賴關系,然后讓你執(zhí)行這個語句: select @@global.sql_mode; 查出有ONLY_FULL_GROUP_BY,然后讓你把ONLY_FULL_GROUP_BY刪掉,再把剩下的值set進去,比如: set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 更有甚者,直接讓你set一個空,合著把所有的檢測這種都給關了: set @@global.sql_mode=''; 比如這個文章就是這么給的解決方案(這個還稍微好點,不是直接set空的): https://blog.csdn.net/qq_34707744/article/details/78031413(并不是針對這個,相同解決方案的文章很多,也不知道誰抄的誰)

這樣搞問題確實也解決了,但治標不治本。

正確的解決方案,應該是優(yōu)化你的sql,因為sql規(guī)范中確實明確指出,用了group by后,select后的字段,只能是group by的字段,或者一些聚集函數(shù),比如sum(a字段)這種。
查看sql92規(guī)范中,人家確實也明確指出針對group by的規(guī)范,如下:
sql相關group by規(guī)范的鏈接:http://dev.cs.ovgu.de/db/sybase9/help/dbugen9/00000284.htm
截圖如下:

大概意思是:

用于GROUP BYSQL / 92標準要求滿足以下條件:SELECT子句的表達式中使用的列必須在GROUP BY子句中。否則,使用該列的表達式是一個聚合函數(shù)。GROUP BY表達式只能包含選擇列表中的列名,而不能僅用作向量聚合的參數(shù)。

解決

所以,針對上面這個不規(guī)范sql,應該改成:
select a字段,b字段 from 表 group by a字段,b字段;
而且最好ab字段是索引,當然這是group by的優(yōu)化部分了,不多說了。

反思

這個問題,說實話我以前也沒太注意,確實也是之前用的都是mysql5.7.5版本之前的低版本,也一直不報錯,所以慢慢的慣出壞習慣了,不認為這是個問題。其實這個問題,也是我的一個很有資歷的同事給我指出的,在此感謝他。
最近由于剛剛換了mysql8高版本版本,也是各種被教育,但我覺得是好事,版本在升級,人也要跟著進步。
絕對不能學習很多網(wǎng)友的那個解決方案,人家高版本專門把這個檢測功能依賴關系加上了,你再手動關掉,那還不如直接用低版本算了。

不過網(wǎng)友的這種想法,有時候想想也能理解一點。因為在軟件行業(yè),干久了就會有一個思維,就是如果一個問題沒辦法正面解決,那就想辦法繞過他,只要最終目的達到就行了。
比如高并發(fā)的這些問題,io的這些問題,確實因為現(xiàn)有技術原因解決不了,所以我們都會選擇繞過正面去解決,比如通過加機器來提高系統(tǒng)并發(fā)等。
所以說,有這種繞過的思維是好的,但不能養(yǎng)成稍微一不會就想著怎么繞過,我們還是要對技術有最基本的探索精神的。

總結

以上是生活随笔為你收集整理的mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。