深入理解group by 語句的執行順序 from→where→group by→select(含聚合函數)


  看到評論區里有朋友提到他在mysql下執行情況好像和文中說到的結果不一致,在此聲明,文中是在oracle11下測試得出的結果。mysql平時用得少,找機會試過之后再來更新帖子。

  由於之前沒有對group by 語句的執行順序(執行原理)做深入的了解,所以導致在實際應用過程中出現了一些問題。舉個簡單的粟子,比如一個表testA中的所有數據如下圖:

  我現在想從testA中查詢username字段,並只取前7位,取了前7位后,想讓相同的數據就合並為一條,我就想當然地寫了如下語句:“select substr(username,0,7) username from testA where 1=1 group by username;”心想萬事大吉了,可執行之后的結果令我詫異了。上圖:

為什么明明是一樣的數據,group by 卻沒有生效呢?我是百思不得其姐啊!經過多次嘗試,探索結果如下:如果將上述SQL語句修改成“select substr(username,0,7) t from testA where 1=1 group by t;”執行時就會報如下錯誤:

  后來在我看了group by語法我執行順序后,我才明白,原來它是先執行group by,再執行substr()函數的,也就是說在上述粟子中,在執行group by時是將“Alberta”、“Alberta1”、“Alberta2”進行group by的,當然不會合並成一條了。也就是說在執行group by時是對表中原來的字段進行分組的,而不是處理之后的數據。

  今記錄如此,忘引以為戒!如有問題或不正之處,歡迎大家指導交流!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM