Oracle起步學習(七)--組函數

分組函數

通過本章學習,您將可以:

l瞭解組函數。

l描述組函數的用途。

l使用GROUPBY 子句數據分組。

l使用HAVING 子句過濾分組結果集


一,組函數:AVG、COUNT、MAX、MIN、SUM

語法:

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

FROM  table

[WHERE  condition]

[GROUP BY  column]

[ORDER BY  column];


1.工資總額:求和函數sum

select sum(sal) from emp;
  SUM(SAL)                                                                      
----------                                                                      
     29025   

2.總人數:計數函數count

select count(*) from emp;
  COUNT(*)                                                                      
----------                                                                      
        14   

3.平均工資:平均值函數avg,組函數忽略空值
select sum(sal)/count(*) 一,avg(sal) 二 from emp;
        一         二                                                           
---------- ----------                                                           
2073.21429 2073.21429                                                           
這裏結果是一樣的,一、二都是計算平均工資

4.平均獎金: 空值 5
select sum(comm)/count(*) 一, sum(comm)/count(comm) 二, avg(comm) 三 from emp;
        一         二         三                                                
---------- ---------- ----------                                                
157.142857        550        550                                                
count(*) :總行數

count(comm):有薪水的個數

select count(*), count(comm)  from emp;
  COUNT(*) COUNT(COMM)                                                          
---------- -----------                                                          
        14           4     

這裏可以使用 nvl組函數使用。


5.在組函數中使用NVL函數:NVL函數使分組函數無法忽略空值

select count(*), count(nvl(comm,0))  from emp;
  COUNT(*) COUNT(NVL(COMM,0))                                                   
---------- ------------------                                                   
        14                 14    

二、分組數據

SELECT  column, group_function(column)

FROM  table

[WHERE  condition]

[GROUP BY  group_by_expression]

[ORDER BY  column];

可以使用GROUPBY子句將表中的數據分成若干組


1.求每個部門的平均工資
select deptno,avg(sal) from emp group by deptno;
    DEPTNO   AVG(SAL)                                                           
---------- ----------                                                           
        30 1566.66667                                                           
        20       2175                                                           
        10 2916.66667      

2.先按照部門分組,再按照工作分組。

select deptno,job,sum(sal) from emp group by deptno,job order by 1
    DEPTNO JOB         SUM(SAL)                                                 
---------- --------- ----------                                                 
        10 CLERK           1300                                                 
        10 MANAGER         2450                                                 
        10 PRESIDENT       5000                                                 
        20 ANALYST         6000                                                 
        20 CLERK           1900                                                 
        20 MANAGER         2975                                                 
        30 CLERK            950                                                 
        30 MANAGER         2850                                                 
        30 SALESMAN        5600                                                

已選擇9行。


SELECT  a,b,...ngroup_function(column)

FROM  table

[GROUP BY  a,b,...n]

[ORDER BY  column];


沒有在組函數中的  (a,b,...n)必須 出現在 GROUP BY 後(GROUP BY  a,b,...n

但是反過來並不一定了。


3.過濾分組:HAVING子句

使用HAVING 過濾分組:

①.  行已經被分組。

②.  使用了組函數。

③.  滿足HAVING 子句中條件的分組將被顯示。

eg:求10號部門的平均工資

select deptno,avg(sal) from emp group by deptno having deptno=10;
    DEPTNO   AVG(SAL)                                                           
---------- ----------                                                           
        10 2916.66667                                                           

注意:HAVING 與 WHERE 功能相當。

區別:HAVING後可以帶有分組函數的,WHERE後 不可以

即可以使用WHERE的地方,HAVING都可以;但是,能用WHERE的地方盡肯能使用WHERE

4.group by 增強: rollup(a,b,c)

group by rollup(a,b)

<==>

group by a,b

+

group by a

+

group by null


eg:

break on deptno skip 2
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
    DEPTNO JOB         SUM(SAL)                                                 
---------- --------- ----------                                                 
        10 CLERK           1300                                                 
           MANAGER         2450                                                 
           PRESIDENT       5000                                                 
                           8750                                                 
                                                                                
                                                                                
        20 CLERK           1900                                                 
           ANALYST         6000                                                 
           MANAGER         2975                                                 
                          10875                                                 
                                                                                

    DEPTNO JOB         SUM(SAL)                                                 
---------- --------- ----------                                                 
                                                                                
        30 CLERK            950                                                 
           MANAGER         2850                                                 
           SALESMAN        5600                                                 
                           9400                                                 
                                                                                
                                                                                
                          29025                                                 
                                                                                
                                                                                

已選擇13行。
break on null 

注:break on cols :一下每列出現重複只顯示一次  


































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章