group by與having子句,grouphaving子句
group by子句
有些情況下。需要把一個表中的行分為多個組,然後將這個組作為一個整體,獲得改組的一些資訊,例如,獲得各個部門的員工人數,或某個部門的員工的平均工資等,這時,就需要使用group by子句子句對錶中的資料進行分組。
使用group by子句,可以根據表中的某一列或某幾列隊表中的資料行進行分組,多個列之間使用逗號分隔,如果根據多個列進行分組,oracle會首先根據第一列進行分組,然後再分出來的組中在按照第二列進行分組,以此類推。
對資料分組後,主要是使用一些彙總函式對分組後的資料進行統計。
具體的操作如下:
SQL> select empno,deptno from emp;
EMPNO DEPTNO
---------- ----------
7369 20
7499 30
7521 30
7566 20
7654 30
7698 30
7782 10
7788 20
7839 10
7844 30
7876 20
7900 30
7902 20
7934 10
7935 20
如上面的資料所示,在deptno在的資料值只有10,20,30,那麼如果我們想統計下屬於部門10,20,30的各個部門各有多少人,我們可以使用以下的語句:
SQL> select deptno "部門編號",count(*) "部門人數" from emp group by deptno;
部門編號 部門人數
---------- ----------
30 6
20 6
10 3
我們也可以統計各個部門的平均工資,如下:
SQL> select deptno,avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1708.33333
20 2645.83333
10 2916.66667
group by和having的使用。
having子句
having子句通常與group by子句一起使用,在完成對分組結果的統計後,可以使用having子句對分組的結果進行進一步的篩選。
一個having子句最多可以包含40個運算式,having子句的運算式之間使用關鍵字and和or分隔。
如下所示,對已經完成分組的部門,我們選出部門人數大於5的部門。
SQL> select deptno "部門編號",count(*) "部門人數" from emp group by deptno having count(*)>5;
部門編號 部門人數
---------- ----------
30 6
20 6
分組後選出部門編號大於10的部門
SQL> select deptno,avg(sal) from emp group by deptno having deptno>10;
DEPTNO AVG(SAL)
---------- ----------
30 1708.33333
20 2645.83333