看到評論區里有朋友提到他在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時是對表中原來的字段進行分組的,而不是處理之后的數據。
今記錄如此,忘引以為戒!如有問題或不正之處,歡迎大家指導交流!
