在SQL中常使用的組函數(shù)有以下幾個:
1藻烤、COUNT(): 求出全部的記錄數(shù)
2、MAX():求出一組中最大的值
3怖亭、MIN():求出最小值
4、AVG():求出平均值
5棺禾、SUM():求和
例如
SELECT MAX(DEGREE),MIN(DEGREE),
AVG(DEGREE),SUM(DEGREE),COUNT(*) FROM SCORE;
--從成績表中查詢最高成績峭跳,最低成績,平均成績蛀醉,總成績和成績行樹
要使用分組統(tǒng)計,則首先應(yīng)該固定其語法拯刁,使用GROUP BY 進(jìn)行分組,此時的SQL語句格式如下:
SELECT(DISTINCT)*|查詢列1 別名1,查詢列2 別名2...
FROM 表名稱1 別名1,表名稱2 別名2
(WHERE 條件)
(GROUP BY 分組條件)
(ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC)
例如
求每門課程的平均成績
--因為有好幾門課程割捅,所以涉及到分組
SELECT CNO,AVG(DEGREE) FROM SCORE
GROUP BY CNO;
image.png
注意:
GROUP BY句中的列要與SELECT中一一對應(yīng)帚桩,不然就報錯。比如
SELECT CNO,SNO,AVG(DEGREE)
FROM SCORE
GROUP BY CNO;
因為SELECT中的SNO學(xué)生號再GROUP BY中沒有對應(yīng)所以就會出錯如下
出錯
? 通過使用WHERE子句莫瞬,可以在將行分成多個組之前先排除某些行郭蕉。
? 必須將列包括在GROUP BY子句中。
? 不能在GROUP BY子句中使用列別名召锈。
另外,在where子句中不能出現(xiàn)分組函數(shù)
SELECT CNO,AVG(DEGREE)
FROM SCORE
WHERE AVG(DEGREE) > 85 --報錯顯示此處不允許使用分組函數(shù)
GROUP BY CNO;
但是如果需求是查詢每門課程平均成績高于85分的成績表规求,該怎么實現(xiàn)呢?這時候就需要HAVING過濾查詢
SELECT CNO,AVG(DEGREE)
FROM SCORE
GROUP BY CNO
HAVING AVG(DEGREE)>85;
使用HAVING子句時阻肿,Oracle將按以下方式對組進(jìn)行限定:
- 對行進(jìn)行分組。
- 應(yīng)用組函數(shù)丛塌。
- 顯示符合HAVING子句的組。