1. 程式人生 > 資料庫 >Oracle第七課

Oracle第七課

Oracle第七課

一、函式

  1. 內建函式

    • 單行函式

      字元函式,數字函式,日期函式,轉換函式
    • 多行函式

      • 統計函式(最大,最小,平均值,求和,計數)

        -- 有多少員工(計數)
        SELECT COUNT(*) FROM emp;
        -- 最高工資
        SELECT MAX(sal) FROM emp;
        -- 最低工資
        SELECT MIN(sal) FROM emp;
        -- 平均工資
        SELECT AVG(sal) FROM emp;
        -- 求每個部門的最高,最低,平均工資,人數,工資總和
        SELECT deptno,MAX(sal),MIN(sal),AVG(sal),SUM(sal),COUNT(*) FROM emp GROUP BY deptno HAVING deptno IS NOT NULL;
        -- 刪除員工表裡部門為空的員工
        DELETE FROM emp WHERE deptno IS NULL;

        -- group by having 過濾條件,having是在分組之後,根據其結果再過濾

        -- 分組和統計是相關的,使用的比較多,having只能跟在分組後,不能單獨使用

        -- SQL優化:儘量在分組前過濾資料,而不是在分組後過濾資料

      • nv1(x1,x2)函式:如果x1為null,則值為x2

        -- 將員工中獎金為空的換成0
        SELECT nv1(comm,0) FROM emp;
      • nv3(x1,x2,x3)函式:如果值是x1,則返回x2,否則的話返回x3

        -- 將員工有獎金的置為1,沒獎金的置為0
        select nv2(comm,1,2) from emp;

        -- nvl是解決空值的問題,nvl2也是空值的問題,區別是nvl2當引數1不為空時提供了額外的

      • decode函式:相當於switch選擇語句

        常用作報表的處理

        -- 如果job = 'CLERK',則顯示為店員,如果job = 'SALESMAN',則顯示為業務員...
        SELECT DECODE(job,'CLERK','店員','SALESMAN','業務員','MANAGER','經理','PRESIDENT','董事長','ANALYST','分析員','未知') FROM emp;
        -- 60到80為普通,80到90為良好,90到100為優秀
        SELECT decode(trunc(&cj/10),6,'普通',7,'普通',8,'良好',9,'優秀',10,'優秀','不及格') FROM dual;
    • sum和decode的應用:行轉列

      CREATE TABLE t_score(NAME VARCHAR(10),course VARCHAR(10),score NUMBER(4,1));
      INSERT INTO t_score VALUES('趙一','Java',100);
      INSERT INTO t_score VALUES('趙一','C',96);
      INSERT INTO t_score VALUES('趙一','C++',85);
      INSERT INTO t_score VALUES('錢一','Java',95);
      INSERT INTO t_score VALUES('錢一','C',84);
      INSERT INTO t_score VALUES('錢一','C++',93);
      SELECT NAME,SUM(score) 總成績, SUM(DECODE(course,'Java',score)) JAVA,SUM(DECODE(course,'C',score)) C,SUM(DECODE(course,'C++',score)) CPlus FROM t_score GROUP BY NAME;

      -- 用sum函式把多行資料統計起來,一個sum是一列

    • 應用

      -- 建一個居民收入表,1-12月,每月輸入它的工資,表中有居民姓名name
      CREATE TABLE resident(NAME VARCHAR(6) NOT NULL,r_month number(2) NOT NULL,sal NUMBER(8) NOT NULL);
      INSERT INTO resident VALUES('趙一',1,10000);
      INSERT INTO resident VALUES('趙一',2,10500);
      INSERT INTO resident VALUES('趙一',3,9000);
      INSERT INTO resident VALUES('趙一',4,10030);
      INSERT INTO resident VALUES('趙一',5,10500);
      INSERT INTO resident VALUES('趙一',6,10000);
      INSERT INTO resident VALUES('趙一',7,12000);
      INSERT INTO resident VALUES('趙一',8,10500);
      INSERT INTO resident VALUES('趙一',9,10800);
      INSERT INTO resident VALUES('趙一',10,10900);
      INSERT INTO resident VALUES('趙一',11,10010);
      INSERT INTO resident VALUES('趙一',12,10800);
      SELECT * FROM resident;
      DROP TABLE resident;
      -- 顯示每個人每月的工資,以列的形式顯示,2020我國的平均收入是40000元左右,顯示該居民是否達到或拖後腿
      SELECT NAME,SUM(DECODE(r_month,1,sal)) 一月,
      SUM(DECODE(r_month,2,sal)) 二月,
      SUM(DECODE(r_month,3,sal)) 三月,
      SUM(DECODE(r_month,4,sal)) 四月,
      SUM(DECODE(r_month,5,sal)) 五月,
      SUM(DECODE(r_month,6,sal)) 六月,
      SUM(DECODE(r_month,7,sal)) 七月,
      SUM(DECODE(r_month,8,sal)) 八月,
      SUM(DECODE(r_month,9,sal)) 九月,
      SUM(DECODE(r_month,10,sal)) 十月,
      SUM(DECODE(r_month,11,sal)) 十一月,
      SUM(DECODE(r_month,12,sal)) 十二月,
      DECODE(TRUNC(SUM(sal)/40000),0,'拖後腿','合格') 是否合格
      FROM resident r GROUP BY NAME;
  2. SQL的遞迴

    • 查出一個奶牛場某頭奶牛的所有後代和父輩

      -- 第一代奶牛的父非為0
      insert into cow values(1,0);
      insert into cow values(100,1);
      insert into cow values(101,1);
      insert into cow values(800,100);
      insert into cow values(902,101);
      insert into cow values(2,0);
      insert into cow values(302,2);

      -- 找id為1的父輩和字輩
      -- 從id為1開始,找兒子:當前id等於下一行的parent_id,找父親:當前id的parent_id等於下一個要找的id
      SELECT * FROM cow START WITH ID=1 CONNECT BY PRIOR ID = parent_id;

二、作業

一個公司有很多部門有上級部門

一個員工有他所在的部門,根據員工編號找到他所在的所有上級部門。

編號姓名部門
1 張三 301
2 李四 401
編號名稱上級部門
301 財務部 11
11 集團中心 2
2 財務總監 0

顯示出張三的上級部門:財務部,集團中心,財務總監