mysql中group by 的用法解析

1. group by的常規用法

group by的常規用法是配合聚合函數,利用分組信息進行統計,常見的是配合max等聚合函數篩選數據後分析,以及配合having進行篩選後過濾。mysql

  • 聚合函數max
  • select max(user_id),grade from user_info group by grade ;
  • 這條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

     

    2. group by的很是規用法

  • select max(user_id),id,grade from user_info group by grade
  • 這條sql的結果就值得討論了,與上述例子不一樣的是,查詢條件多了id一列。數據按照grade分組後,grade一列是相同的,max(user_id)按照數據進行計算也是惟一的,id一列是如何取值的?看上述的數據結果,
    推論:id是物理內存的第一個匹配項。
    到底是與不是須要繼續探討。.net

    修改數據

    • 修改id按照上述數據結果,將id=1,改成id=99,執行sql後結論:
    • 顯然,與上述例子的結果不一樣。第一條數據id變成了99,查出的結果第一條數據的id從1變成了2。代表,id這個非聚合條件字段的取值與數據寫入的時間無關,由於id=1的記錄是先於id=2存在的,修改的數據不過是修改了這條數據的內容。結合mysql的數據存儲理論,因爲id是主鍵,因此數據在檢索是是按照主鍵排序後進行過濾的,所以
      推論:id字段的選取是按照mysql存儲的檢索數據匹配的第一條。
      將id改成1後恢復了原始結果,沒法推翻上述推論。
      更改查詢條件blog

    • select max(user_id),user_id,id,grade from user_info group by grade
    • 將數據user_id改成10999後,執行結果爲排序

    • 結論

      • 當group by 與聚合函數配合使用時,功能爲分組後計算
      • 當group by 與having配合使用時,功能爲分組後過濾
      • 當group by 與聚合函數,同時非聚合字段同時使用時,非聚合字段的取值是第一個匹配到的字段內容,即id小的條目對應的字段內容。
      •  

        ---------------------
        做者:kingszelda
        來源:CSDN
        原文:https://blog.csdn.net/kingszelda/article/details/72621971
        版權聲明:本文爲博主原創文章,轉載請附上博文連接!內存

相關文章
相關標籤/搜索