簡介:"Group By"根據字面上的意思理解,就是根據"By"后面指定的規則對數據進行分組(分組就是將一個數據集按照"By"指定的規則分成若干個子數據集),然后再對子數據集進行數據處理。
1、下面通過一個實例來了解"Group By"的作用和功能,代碼如下:
select * from course
這是一個課程明細表,現在有一個報表程序,需要每個老師的編號,以及每位老師所教的課程總數,下面是解決代碼:
select tno,COUNT(cname) as courses from course group by tno
這就是個人的理解,上圖是通過Group By分組之后的第一組,后面的數據集合包含教師ID為t001的所有行數數據,這個數據集合我們可以使用聚集函數來獲取我們想要的信息,但是無法獲取其中的詳細的列信息!原因我們可以通過上圖的結構可以看出!
ok,通過group by 完成需求!
上面的Select指定了兩個列,tno包含教師的編號,courses 為計算字段(用Count()函數建立),group by子句指示DBMS按tno排序並分組數據。這就會對每個tno而不是整個表計算courses一次(也就是說DBMS會對(按照tno排序並分組之后的單個數據子集)進行Count()運算,而不是真個數據集)。
2、下面是使用Group By子句需要知道的一些重要的規定
(1)Group By子句可以包含任意數目的列,因而可以對分組進行嵌套,進行更細致的分組。
(2)Group By子句中列出的每一列都必須是檢索列(或者有效的表達式,注意不能是聚集函數)。如果在SELECT中使用了檢索列(或者表達式),則在Group By子句中使用相同的表達式,不能使用別名。
(3)大多數SQL不允許Group By帶有可變長度的數據類型(如文本,text類型)。
(4)除聚集計算語句外,SELECT語句中的每一列都必須在Group By中給出。
(5)如果分組列中包含具有Null值的行,則Null將作為一個分組返回,如果列中有多行Null,他們將作為一個分組返回。
(6)Group By必須出現在Where子句之后,Order By子句之前。
(7)如果在Group By子句中嵌套了分組,數據將在最后指定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算(不能從個別的列中取回數據)。
3、Group By All+多個字段,Group By+多個字段
在SQL Server 中Group By All+多個字段和Group By+多個字段在效果是一樣的,都是通過多個字段來分組!如下代碼:
select * from course
這是一個課程明細表,現在有個報表程序需要展示每個老師教授的課程(相同的課程)一共教多少個班級,下面是解決代碼:
select tno,cname,COUNT(cname) from course group by all tno,cname order by tno
這是個人的理解,上圖是通過Group By分組之后的第一組,后面的數據集合包含(教師ID為t001並且課程名稱為Oracle)的所有行數數據,這個數據集合我們可以使用聚集函數來獲取我們想要的信息,但是無法獲取其中的詳細的列信息!原因我們可以通過上圖的結構可以看出!
ok,解決需求,通過上面的結果圖,我們可以看出,三個老師所教的課程基本都只教一個班,除了t003老師的sql SERVER 2005教了兩個班,當然我們實際的業務中,並不會這樣建表,我這邊指示為了演示Group By+多個字段能完成的功能,才強行構建這個需求!