mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column
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)上搜到的解決方案是:
這樣搞問題確實也解決了,但治標不治本。
正確的解決方案,應該是優(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 BY的SQL / 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 改进初学者的PID-介绍
- 下一篇: linux cmake编译源码,linu