- 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的組等。