GROUP BY用於對錶或者視圖的資料按欄位分組:
例如:
求各專業的學生人數:
USE StudentsSELECT 專業名, COUNT(*) AS '學生數'FROM XSGROUP BY 專業名
產生一個結果集,包括每個專業的男生人數,女生人數,總人數及學生總人數
USE StudentsSELECT 專業名, 性別, COUNT(*) AS '人數'FROM XSGROUP BY 專業名,性別WITH ROLLUP
電腦 0 3
電腦 1 8
電腦 NULL 11
通訊工程 0 1
通訊工程 1 1
通訊工程 NULL 2
NULL NULL 13
帶有WITH ROLLUP將會產生一個合計列。
如果使用WITH CUBE:
USE StudentsSELECT 專業名, 性別, COUNT(*) AS '人數'FROM XSGROUP BY 專業名,性別WITH CUBE
結果如下:
電腦 0 3
通訊工程 0 1
NULL 0 4
電腦 1 8
通訊工程 1 1
NULL 1 9
NULL NULL 13
電腦 NULL 11
通訊工程 NULL 2
CUBE操作符對GROUP BY 子句中的各列的所有可能組合均產生合計列。
HAVING
使用GROUP BY子句和彙總函式對資料進行分組後,還可以用HAVING子句對分組資料進行進一步的篩選。
例如: 尋找平均成績大於85分的
SELECT 學號, AVG(成績) AS '平均成績'FROM XS_KCGROUP BY 學號HAVING AVG(成績)>=85
當使用HAVING子句時,注意以下事項和原則:
- HAVING子句只有與GROUP BY子句聯用才能對分組進行約束。只使用HAVING子句而不使用GROUP BY子句是沒有意義的。
- 可以引用任何出現在挑選清單中的列。
- 不要與HAVING子句一起使用ALL關鍵字,因為HAVING子句會忽略ALL關鍵字而返回只滿足自己條件的分組。
COMPUTE
COMPUTE子句用於分類匯總。COMPUTE將產生額外的合計列
USE StudentsSELECT 學號, 姓名, 出生時間FROM XSWHERE 專業名 = '通訊工程'COMPUTE COUNT(學號)
會在一個單獨的視窗裡面顯示COMPUTE裡面彙總函式的結果
ORDER BY
ORDER BY子句對查詢結果進行排序
系統預設的是ASC升序。要使用降序可以用DESC
將電腦專業的學生按出生日期先後排序
USE StudentsSELECT 學號, 姓名, 出生時間FROM XSWHERE 專業名 = '電腦'ORDER BY 出生時間
當使用子句和運算子摘要資料時,注意下面的推薦操作:
- 對經常彙總的列進行索引可以提高查詢效率。例如,增加quantity列的索引能加快匯總操作的執行,甚至當使用了ROLLUP運算子時也是如此。
- 在包含空值的列中避免使用彙總函式,因為結果集可能並沒有正確地返回你要查詢的資料。
在結果集中使用ORDER BY子句以保證返回資料的排列順序。如果不使用ORDER BY子句,SQL Server就不保證結果順序。
- 因為ROLLUP運算子比CUBE運算子更高效,所以只要可能就使用它。ROLLUP運算子之所以高效是因為它把摘要資料作為具體資料處理。CUBE運算子在執行時需要大量的運算,所以它需要更多的資源。
- 使用COMPUTE或COMPUTE BY子句,是因為它們可以有助於查看和輸出用於測試應用程式的結果集。但是,它們產生的額外匯總記錄不符合關係型格式,所以它們不適合作為產品資料庫的輸出。