程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle學習筆記6--分組函數

Oracle學習筆記6--分組函數

編輯:Oracle教程

上一次筆記學習了,多表查詢,本次筆記來學習Oracle中的分組函數。

首先來了解一下什麼是組函數:

組函數:作用於一組數據,並對一組數據返回一個值。

SQl中組函數的類型:

COUNT():求出全部的記錄數。

MAX():求出一組數據中的最大值。

MIN():求出最小值。

AVG():求平均值。

SUM():求和。

數值型數據可以使用AVG()和SUM()函數;MIN()和MAX()函數適用於任意數據類型,但是一般應用在數值類型上。

基本語法:

SELECT [column], group_function(column), ...

FROM table

[WHERE condition]

例:使用count()函數,求出雇員表中記錄總數。

SQL> select count(*) from emp ;

COUNT(*)
----------
14

SQL> select count(deptno ) from emp ;

COUNT(EMPNO)
------------
14

count()函數括號中,可以使用*,*表示返回所有記錄的總數。可以使用列名,列名表示返回該列記錄中不為空的記錄總數。在上面的結果中,查詢部門號,在結果中顯示有14條數據,在部門表中只有4條數據,那麼返回的查詢結果中存在重復的情況。可以使用distinct 關鍵字,來去重。即:select count(distinct deptno ) from emp ; , 返回的結果為3。

例:使用MAX 、MIN,求雇員表中,員工的最高工資和最低工資。

SQL> select max(sal) , min(sal ) from emp ;

MAX(SAL) MIN(SAL)
---------- ----------
5000 800

例:使用AVG、SUM函數,求雇員表中,30號部門的工資平均值和工資總和。

SQL> select sum(sal) ,avg(sal) from emp where deptno = 30 ;

SUM(SAL) AVG(SAL)
---------- ----------
9400 1566.66666

使用group by 字句,來為數據分組。

基本語法:

SELECT [column,] group_function(column), ...

FROM table

[WHERE condition]

[GROUP BY column]

[ORDER BY column asc | desc];

例:求雇員表中每一個部門的雇員數量

SQL> select deptno , count(deptno)
2 from emp
3 group by deptno ;

DEPTNO COUNT(DEPTNO)
------ -------------
30 6
20 5
10 3

按照deptno對數據進行分組,之後統計每一個分組中的記錄總數。並將結果返回。

例:求每個部門的平均工資,結果取整。

SQL> select round(avg(sal)) , deptno from emp group by deptno ;

ROUND(AVG(SAL)) DEPTNO
--------------- ------
1567 30
2175 20
2917 10

注意:

跟在select後面的字句,除了函數外,也可以跟列名。如果跟列名那麼應該和group by後面的列名一致。否則出現ORA-00979: 不是 GROUP BY 表達式錯誤。

例:

select deptno ,empno ,count(empno)
from emp
group by deptno

ORA-00979: 不是 GROUP BY 表達式 ,empno 為多余的列。

select deptno , count(empno)
from emp
group by deptno ; 正確執行。

例:求平均工資大於200 的部門

select deptno
from emp
where avg(sal) > 2000
group by deptno

ORA-00934: 此處不允許使用分組函數

當我們執行,上面的sql語句的時候提示,where後面不允許使用分組函數。即:分組函數不允許在where語句之後出現。如果要對分組函數加入限制條件,使用HAVING 子句。HAVING子句必須與GROUP BY 子句連用,可以放在GROUP BY之前,也可以房子之後。GROUP BY可以單獨使用。

即:

select deptno
from emp
having avg(sal) > 2000
group by deptno

結果為:

DEPTNO
------
20
10

例:查詢部門平均工作中最大的工資

SQL> select max(avg(sal)) from emp group by deptno ;

MAX(AVG(SAL))
-------------
2916.66666666

通過上面的結果,說明組函數可以嵌套使用。但是select 後面不能再出現 deptno字段名,否則出現ORA-00937: 不是單組分組函數提示。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved