group by的常規用法是配合聚合函數,利用分組信息進行統計,常見的是配合max等聚合函數篩選數據後分析,以及配合having進行篩選後過濾。mysql
這條sql的含義很明確,將數據按照grade字段分組,查詢每組最大的user_id以及當前組內容。注意,這裏分組條件是grade,查詢的非聚合條件也是grade。這裏不產生衝突。sql
having
select max(user_id),grade from user_info group by grade having grade>'A'
函數
這條sql與上面例子中的基本相同,不事後面跟了having過濾條件。將grade不知足’>A’的過濾掉了。注意,這裏分組條件是grade,查詢的非聚合條件也是grade。這裏不產生衝突。spa
這條sql的結果就值得討論了,與上述例子不一樣的是,查詢條件多了id一列。數據按照grade分組後,grade一列是相同的,max(user_id)按照數據進行計算也是惟一的,id一列是如何取值的?看上述的數據結果,
推論:id是物理內存的第一個匹配項。
到底是與不是須要繼續探討。.net
顯然,與上述例子的結果不一樣。第一條數據id變成了99,查出的結果第一條數據的id從1變成了2。代表,id這個非聚合條件字段的取值與數據寫入的時間無關,由於id=1的記錄是先於id=2存在的,修改的數據不過是修改了這條數據的內容。結合mysql的數據存儲理論,因爲id是主鍵,因此數據在檢索是是按照主鍵排序後進行過濾的,所以
推論:id字段的選取是按照mysql存儲的檢索數據匹配的第一條。
將id改成1後恢復了原始結果,沒法推翻上述推論。
更改查詢條件blog
將數據user_id改成10999後,執行結果爲排序
---------------------
做者:kingszelda
來源:CSDN
原文:https://blog.csdn.net/kingszelda/article/details/72621971
版權聲明:本文爲博主原創文章,轉載請附上博文連接!內存