1. 程式人生 > >ORACLE:分組統計函式(COUNT()、SUM()、AVG()、MAX()、MIN())的使用

ORACLE:分組統計函式(COUNT()、SUM()、AVG()、MAX()、MIN())的使用

知識點:

統計函式:
COUNT()、SUM()、MIN()、MAX()、AVG()

這些統計函式是允許和其它函式巢狀的

例:統計出企業員工的平均僱傭年限

以上的幾個操作函式,在表中沒有資料的時候,只要COUNT()函式會返回結果,其它都是Null

可見只有COUNT()函式會返回最終的結果,即使沒有資料也返回0,而其他的都是null

分組統計

例:根據部門編號分組,查詢出每個部門的編號、人數、平均工資

例:根據職位分組,統計出每個職位的人數,最低工資與最高工資

實際上GROUPBY子句之所以使用麻煩,是因為分組的時候有一些約定條件:

如果查詢不使用GROUPBY子句,那麼SELECT子句只允許出現統計函式,其它任何欄位不允許出現

如果查詢中使用了GROUPBY子句,那麼SELECT中只允許出現分組欄位,統計函式,其它都不允許出現。

統計函式允許潛巢狀,但是巢狀之後的SELECT子句裡面只允許出現巢狀,而不允許出現任何欄位,包括分組欄位。

多表查詢與分組統計(重點)

對於GROUP BY 子句而言實在WHERE子句之後執行的,所以在使用時可以進行限定查詢

例:查詢出每個部門的名稱、部門人數、以及平均工資

第二步:此時的查詢結果中,對於部門名稱出現了重複的內容,按照分組來講,只要是出現了重複,就可以進行分組,只不過此時的分組是針對於臨時表(查詢結果),既然已經確定了dname上存有重複記錄,故直接針對於dname分組即可

HAVING子句

現在要求查詢每個職位的名稱,職位的平均工資,但是要求顯示的職位的工資高於2000即可,即按照職位先進行分組,同時統計出每個職位的平均工資,隨後要求顯示那些平均工資高於2000的職位資訊,對要顯示的資料進行篩選,自然就會想到WHERE子句,餘數就寫了如下程式碼。

直接告訴使用者WHERE子句上不允許出現統計函式(分組函式),因為GROUP BY 是在WHERE子句之後執行的,那麼此時執行WHERE子句時還沒有進行分組,無法進行統計。此情況必須使用另外一個子句完成,HAVING子句,而此時的SQL語法變成如下形式:

例:使用HANVING子句

關於WHERE與HAVING的區別:

WHERE子句是在GROUP BY 分組之前進行篩選的,指的是選出那些可以參入分組的資料。並且WHERE子句中不允許出現統計函式。

HAVING子句是在GROUP BY 分組之後進行的,可以使用統計函式。

分組案例

例1:顯示所有非銷售人員的工作名稱以及從事同一工作的僱員的月工資的總和,並且要求滿足從事同一工作僱員的月工資的總和大於5000,顯示結果按照月工資的合計的升序排列。

第二步:按照職位進行分組,之後求出月工資的總支出

第三步:分組後的資料進行再次篩選,使用HAVING子句

第四步:按照月工資的合計升序排列,使用ORDER BY

例:統計所有領取佣金和不領取佣金人員的人數,平均工資

使用GROUP BY的時候,會把每個種子值當作一個分組,所以此時不可能直接使用GROUP BY

現在可以換一個思路,把問題拆分一下:

查詢出所有領取佣金的僱員的人數,平均工資。直接使用WHERE子句,都不用GROUP BY

查詢出所有不領取佣金的僱員的人數,平均工資。直接使用WHERE子句,都不用GROUP BY

此時兩個查詢結果返回的結構完全相同,直接連線即可