00103 SQL查詢進階:group by字句

  • GROUP BY: 分組
     SELECT ... FROM... WHERE... GROUP BY... ORDER BY...
    • GROUP BY的順序要排在ORDER BY之前
    • GROUP BY語句的算法對CPU運行效率有很大影響,一定要儘量優化
    • GROUP BY分組的對象一般不是原本的記錄行,而是對上述第三部分的五個彙總函數得出的結果,根據指定字段來進行拆分,因爲如果要按原本記錄行來分組,用order by+distinct就可以實現了——這裏要注意,如果要按某個字段進行分組,這個字段必須被包括在select的對象裏才行,不然就會得到空結果
    • 同樣也有像ORDER BY裏一樣的簡化寫法
          EG:對人員表person中不同性別佔比進行統計,語句如下
     SELECT Sex, COUNT(*)AS amount FROM person GROUP BY Sex
  • ROLLUP:對分組結果進行一個合計
     /對於一些低版本的數據庫,可能不支持rollup和cube函數,需要修改兼容級別到100
     USE [master]
     GO
     ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 100
     GO
    • 單維度小計,對一個字段進行group by rollup
          SELECT Sex, COUNT(*)AS amount FROM person GROUP BY SexGROUP BY ROLLUP(Sex)

      • ROLLUP過程相當於以下兩步:
        • 執行不帶rollup的select&group by,得到前三行結果
        • 執行rollup,對rsex進行小計,得到第四行
    • 雙維度小計,對兩個字段進行group by rollup——聯繫數據透視表的原理進行理解
      • 當rollup的參數多於一個時,邏輯過程如下
        • 執行不帶rollup的select&group by,得到的是最詳細的雙維度分類結果
        • 首先按照group by rollup()的第一個參數進行小計,就是下列代碼中的部門編碼,統計各部門總人數,得到每個dept_num的最後一行
        • 然後按照第二個參數性別來進行小計,統計所有性別的總人數,得到最後一行
          SELECT Sex,deptcode,COUNT(*)AS amount FROM person GROUP BY ROLLUP(deptcode,Sex)
    • 多維度:以此類推
  • CUBE:如果說rollup是層層遞進的邏輯,先彙總第一個參數,然後第二個第三個,知道全部,它的數據是從細到粗不斷遞進的;那麼cube則是一個矩陣形式,對所有參數進行排列組合,對所有可能的組合進行一次彙總小計,最後在進行全表彙總。——因此,cube經常被用來生成交叉報表。

  • 上圖中,sex是維度1,dept是維度2。
    • group by cube(1,2)——1*2,1,2,總
    • 1*2:第1、2、4、5、7、8行
    • 1:第3、6、9行
    • 2:第10、11行
    • 總:第12行

  • HAVING:給GROUP BY添加限制條件,只返回符合having條件的group——在GROUP BY之後,ORDER BY之前
    • 一定要區分好where和having,where的條件限制的是select的對象,而having的條件限制的是已經分好的組,因此,having的條件也通常由彙總函數構成,比如只返回平均值大於100的組,只返回最大值大於50的組等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章