oracle學習筆記之五 組函數

 1.Oracle包含以下組函數
  -AVG([DISTINCT|ALL]n) 返回平均值,忽略空值
  -COUNT({*|[DISTINCT|ALL]}expr) 返回記錄的數量,用*包含空值,否則不包含空值
  -MAX([DISTINCT|ALL]expr)  返回最大值,忽略空值
  -MIN([DISTINCT|ALL]expr) 返回最小值,忽略空值
  -SUM([DISTINCT|ALL]n)  返回總值,忽略空值
  -STDDEV([DISTINCT|ALL]x)  返回標準差,忽略空值
  -VARIANCE([DISTINCT|ALL]x)  返回統計方差,忽略空值

 

2.AVG和SUM的用法
  -可以對數值型數據使用AVG和SUM 
  例:
     SELECT AVG(sal),SUM(sal)
     FROM   EMP
     WHERE  job LIKE 'SALES%';

 

3.MIN和MAX的用法
  -MIN和MAX可以用於任何數據類型
  例:
     SELECT MIN(hiredate),MAX(hiredate)
     FROM   emp;
  結果:
       MIN(HIREDATE)   MAX(HIREDATE) 
        17-12月-80      23-5月 -87 

 

4.COUNT的用法
1)COUNT(*)返回表中行的總數
  例:
     SELECT  COUNT(*)
     FROM    emp
     WHERE   deptno=30;
  結果:
        COUNT(*) 
              6 
2)COUNT(expr)返回非空行的數量
  例:
     SELECT  COUNT(comm)
     FROM    emp
     WHERE   deptno=30;
  結果:
       COUNT(*) 
              4

 

5.組函數和空值
1)組函數會忽略列中的空值
  例:
     SELECT  AVG(comm)
     FROM    emp;
  結果:
       AVG(COMM)
             550
2)NVL函數可以使組函數強制包含含有空值的記錄
  例:
     SELECT AVG(NVL(comm,0))
     FROM   emp;
  結果:
       AVG(NVL(COMM,0)) 
             157.142857 

 

6.創建數據組
  SELECT     column,group_function(column)
  FROM       table
  [WHERE     condition]
  [GROUP BY  group_by_expression]
  [OEDER BY  column];
 
  -通過GROUP BY子句將表中的記錄劃分成若干個小組
  -GROUP BY子句中必須包含指定的列
  -GROUP BY子句中不能使用列的別名
  -當使用GROUP BY子句時Orale服務器會自動對結果集合默認按GROUP BY子句所指定的列升序排列
  -在SELECT列表中除了組函數外,所有列都必須包含在GROUP BY子句中
  例:
     SELECT   deptno,AVG(sal)
     FROM     emp
     GROUP BY deptno;
  結果:
        DEPTNO     AVG(SAL) 
          10       2916.66667 
          20       2175 
          30       1566.66667
   -GROUP BY所指定的列並不是必須出現在SELECT列表中
   例:
      SELECT   AVG(sal)
      FROM     emp
      GROUP BY deptno;
   結果:
             AVG(SAL) 
           2916.66667 
                 2175 
           1566.66667

 

7.按多個列分組
  例:
     SELECT   deptno,job,sum(sal)
     FROM     emp
     GROUP BY deptno,job;
  結果:
        DEPTNO     JOB       SUM(SAL) 
            10     CLERK         1300 
            10     MANAGER       2450 
            10     PRESIDENT     5000 
            20     CLERK         1900 
            20     ANALYST       6000 
            20     MANAGER       2975 
            30     CLERK          950 
            30     MANAGER       2850 
            30     SALESMAN      5600 

 

8.使用組函數的非法查詢
  例:
     SELECT dept,COUNT(ename)
     FROM   emp;
  結果:
        ERROR 位於第 1 行:
        ORA-00937: 非單組分組函數
  糾正:
       SELECT   dept,COUNT(ename)
       FROM     emp
       GROUP BY deptno;
  結果:
        DEPTNO    COUNT(ENAME) 
            10               3 
            20               5 
            30               6 


9.限制組結果
  使用HAVING子句限制組
  -對記錄分組
  -在分組的基礎上應用組函數
  -與HAVING子句匹配的結果才輸出

  SELECT    column,group_function
  FROM      table
  [WHERE    condition]
  [GROUP BY group_by_expression]
  [HAVING   group_condition]
  [ORDER BY column];
 
  例1:
     SELECT   deptno,max(sal)
     FROM     emp
     WHERE    max(sal)>2900
     GROUP BY deptno;
  結果:
        ERROR 位於第 3 行:
        ORA-00934: 此處不允許使用分組函數
  糾正:
        SELECT   deptno,max(sal)
        FROM     emp
        GROUP BY deptno
        HAVING   max(sal)>2900;
  結果:
        DEPTNO     MAX(SAL) 
            10         5000 
            20         3000
  例2:
        SELECT   job,SUM(sal) PAYROLL
        FROM     emp
        WHERE    job NOT LIKE 'SALES%'
        GROUP BY job
        HAVING   SUM(sal)>5000
        ORDER BY SUM(sal);
  結果:
        JOB           PAYROLL 
        ANALYST          6000 
        MANAGER          8275 

 

10.組函數嵌套
   -與單行函數不同,組函數只能嵌套兩層
   例:顯示平均薪水的最大值
       SELECT   max(avg(sal))
       FROM     emp
       GROUP BY deptno;
   結果:
         MAX(AVG(SAL)) 
            2916.66667 


練習
1.使用emp表顯示所有僱員的最多、最少、總和、平均薪水
  
   SELECT ename,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM   emp;
 
2.顯示emp表中不同部門編號的數量
 
   SELECT COUNT(DISTINCT deptno)
   FROM   emp;

3.在emp表中根據job列分組顯示僱員的最多、最少、總和、平均薪水
  
   SELECT   job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM     emp
   GROUP BY job;

4.使用emp表顯示job名、每組最多、最少、總和、平均薪水
  要求:按job列分組,ename列的名字不是以A開頭,且任何組的最少薪水大於1600

   SELECT   job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM     emp
   WHERE    ename NOT LIKE 'A%'
   GROUP BY job
   HAVING   MIN(sal)>1600


5.顯示部門名和每個部門的累計薪水,要求每個部門的累計薪水大於3000

   SELECT   dname,SUM(sal)
   FROM     emp e,dept d
   WHERE    e.deptno=d.deptno
   GROUP BY dname
   HAVING   SUM(sal)>3000;

6.顯示每個部門、每個崗位的最高及最低薪水

   SELECT   deptno,job,MAX(sal),MIN(sal)
   FROM     emp
   GROUP BY deptno,job;

 


 

 


       
  

 

 

 


      
 


 

 

 

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