Group By 誰不會啊?這不是最簡單的嗎?越是簡單的東西,咱們越會忽略掉他,由於咱們不肯意再去深刻了解它。
1 小時 SQL 極速入門(一)
1 小時 SQL 極速入門(二)
1 小時 SQL 極速入門(三)——Oracle 分析函數
SQL 高級查詢——(層次化查詢,遞歸)sql
今天就帶你們瞭解一下Group By 的新用法吧。segmentfault
ROLL UP 搭配 GROUP BY 使用,能夠爲每個分組返回一個小計行,爲全部分組返回一個總計行。函數
直接看例子,咱們有如下數據表,包含工廠列,班組列,數量列三列。spa
當向 ROLLUP 傳入一列時,會獲得一個總計行。code
SELECT factory, SUM(quantity) FROM production GROUP BY ROLLUP(factory) ORDER BY factory
結果:遞歸
當向 ROLLUP 傳遞兩列時,將會按照這兩列進行分組,同時按照第一列的分組結果返回小計行。咱們同時傳入工廠和部門看一下。get
SELECT factory,department, SUM(quantity) FROM production GROUP BY ROLLUP(factory, department) ORDER BY factory
結果:it
能夠看到對每個工廠都有一個小計行,最後對全部的有一個總計行。也能夠這樣理解 io
若是 ROLLUP(A,B)則先對 A,B進行 GROUP BY,以後對 A 進行 GROUP BY,最後對全表 GROUP BY。入門
若是 ROLLUP(A,B,C)則先對 A,B,C進行 GROUP BY ,而後對 A,B進行GROUP BY,再對 A 進行GROUP BY,最後對全表進行 GROUP BY.
CUBE 和 ROLLUP 對參數的處理是不一樣的,咱們能夠這樣理解。
若是 CUBE(A,B)則先對 A,B 進行 GROUP BY,以後對 A 進行 GROUP BY,而後對 B 進行 GROUP BY,最後對全表進行 GROUP BY.
若是 CUBE(A,B,C)則先對 A,B,C 進行 GROUP BY,以後對 A,B ,以後對A,C ,以後對 B,C 以後對 A,以後對 B,以後對 C,最後對全表GROUP BY
看一個簡單的例子:
SELECT factory,department, SUM(quantity) FROM production GROUP BY CUBE(factory, department) ORDER BY factory,department;
結果:
能夠看出來首先對 FACTORY,DEPARTMENT進行分組彙總,而後對FACTORY 分組彙總,以後對 DEPARTMENT 分組彙總,最後有一行全表彙總。
GROUPING()函數只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,若是此列不爲空則返回0,若是爲空則返回1.
咱們用第一個ROLLUP例子舉例
SELECT GROUPING(factory), factory, department, SUM(quantity) FROM production GROUP BY ROLLUP(factory, department) ORDER BY factory, department;
結果:
看到,最後一行的 FACTORY 爲空,因此 GROUPING()返回 1.也能夠與CUBE結合使用,方法是同樣的。
GROUPING SETS 與 CUBE 有點相似,CUBE是對參數進行自由組合進行分組。GROUPING SETS則對每一個參數分別進行分組,GROUPING SETS(A,B)就表明先按照 A 分組,再按照 B分組。
SELECT factory, department, SUM(quantity) FROM production GROUP BY GROUPING SETS(factory, department) ORDER BY factory, department
結果:
能夠看出來結果是按照工廠和部門分別分組彙總的。
GROUPING_ID()配合GROUPING()函數使用,GROUPING_ID(A,B)的值由GROUPING(A)與GROUPING(B)的值決定,若是GROUPING(A)爲1,GROUPING(B)爲0,則GROUPING_ID(A,B)的值爲 10,十進制的 3.
SELECT factory, department, GROUPING(factory), GROUPING(department), GROUPING_ID(factory,department), SUM(quantity) FROM production GROUP BY CUBE(factory, department) ORDER BY factory, department;
結果:
有了GROUPING_ID列,咱們就可使用 HAVING 字句來對查詢結果進行過濾。選擇GROUPING_ID=0的就表示 FACTORY,DEPARTMENT兩列都不爲空。