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

Oracle第六課

Oracle第六課

一、第五課課後作業講解

  • SQL優化時,對於索引的資料型別是有要求的,比如列的型別是char型,查詢條件就必須是char型,如果是數字型,則索引失效

    age列建了索引,它是char型,where age>18,此處18是數字,索引失效

    Java中的age必然是int型,number

  • 表結構不合理

  • 建立班級表

    CREATE TABLE t_clazz(ID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL);
  • 建立學生表

    CREATE TABLE t_student(ID NUMBER(12) PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL,
    sex NUMBER(1) CHECK(sex=1 OR sex = 0) NOT NULL,
    age NUMBER(2) NOT NULL,
    clazz NUMBER(10) REFERENCES t_clazz(ID));
  • 兩表連線的方式

    -- 內連線
    SELECT s.*,c.* FROM t_student s INNER JOIN t_clazz c ON s.clazz=c.id;
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s,t_clazz c WHERE s.clazz=c.id;
    -- 左外連線
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s LEFT OUTER JOIN t_clazz c ON s.clazz=c.id;
    -- 右外連線
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s RIGHT OUTER JOIN t_clazz c ON s.clazz=c.id;
    -- 全連線
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s FULL JOIN t_clazz c ON s.clazz=c.id;
  • 在oracle中特有的通俗的寫法

    -- 內連線
    select xx from a,b where a.id=b.id;
    -- 右連線,主表是不帶加號的表
    -- 右連線
    select xx from a,b where a.id(+)=b.id
    -- 左連線
    select xx from a,b where a.id =b.id(+);

二、函式

  • 虛表:dual,做測試用的表

  • 函式

    • 單行函式

      1. 字元函式:ascii(x)

        SELECT ASCII('a') FROM dual;
      2. 拼接字串:concat('a','b')

        SELECT CONCAT('a','b'),'a'||'b' FROM dual;
      3. 找字串中某個字元的位置,位置從1開始

        -- 找字元c的位置
        SELECT INSTR('abcdefg','c') FROM dual;
        -- 從第4個字元開始找
        SELECT INSTR('abcdefgc','c',4) FROM dual;
        -- 從第一個開始找,找第一個出現的c
        SELECT INSTR('abcdefgc','c',1,2) FROM dual;
      4. 返回字串的長度:length

        SELECT LENGTH('aaaa') FROM dual;
      5. 將字元全轉換成小寫或大寫

        -- 將字元全轉換成小寫,或大寫
        SELECT LENGTH('aaaa'),LOWER('aBcD'),UPPER('aBcD') FROM dual;
      6. 替換:replace

        -- 替換
        SELECT REPLACE('abc123','1','a') FROM dual;
      7. 擷取字串:replace

        -- 擷取字串
        -- 從1開始擷取3個
        SELECT SUBSTR('abcdef',1,3) FROM dual;
      8. 去掉左邊的字元(預設是空格):LTRIM,去掉右邊的RTRIM,去掉兩邊的TRIM

        SELECT LTRIM('     abc    '),rTRIM('     abc    ')
        ,TRIM('     abc   '),TRIM('1' FROM '1111a1b1c11') FROM dual;
      9. 數字函式

        -- 取絕對值
        SELECT ABS(-1) FROM dual;
        -- 取大於或等於x的最小值
        SELECT CEIL(-1.1),CEIL(1.9) FROM dual;
        -- 取小於或等於x的最大值
        SELECT FLOOR(-1.1),FLOOR(1.2) FROM dual;
        -- 四捨五入,第二個值用來指定保留幾位小數
        SELECT ROUND(3.45),ROUND(3.45,1) FROM dual;
        -- 直接截斷,沒有y的話取整,不會四捨五入
        SELECT TRUNC(7.25),TRUNC(7.25,1) FROM dual;
        -- 取餘
        SELECT MOD(5,2) FROM dual;
      10. 日期函式

        -- 當前日期
        SELECT SYSDATE FROM dual;
        -- 增加一月
        SELECT add_months(SYSDATE,1) FROM dual;
        -- 返回data所在月的最後一天的日期
        SELECT last_day(SYSDATE) FROM dual;
        -- 四捨五入日期
        SELECT ROUND(SYSDATE),ROUND(SYSDATE,'month'),ROUND(SYSDATE,'year') FROM dual;
        -- 月份差
        SELECT e.*,months_between(SYSDATE,hiredate),trunc(months_between(SYSDATE,hiredate)) FROM emp e WHERE empno IN(7369,7499);
        -- 當前日期的下個星期一是幾號
        SELECT next_day(SYSDATE,'星期一') FROM dual;
        -- 從員工表中提取員工的入職月份
        SELECT EXTRACT(MONTH FROM hiredate) FROM emp;
        -- 截斷:trunc
        SELECT TRUNC(SYSDATE,'day') FROM dual;
      11. 應用

        -- 工作年限
        SELECT trunc(months_between(SYSDATE,hiredate)) FROM emp;
        -- 找到工作年限最長的員工
        SELECT t.empno,t.maxs_date FROM (SELECT e.*,TRUNC(months_between(SYSDATE,hiredate)) maxs_date FROM emp e) t WHERE t.maxs_date IS NOT NULL AND ROWNUM = 1;
        -- 給工作年限超過兩年的員工sal增加100元
        SELECT t.*,t.sal+100 sal2 FROM (SELECT e.*,trunc(months_between(SYSDATE,hiredate)/12) work_YEAR FROM emp e WHERE hiredate IS NOT NULL) t WHERE t.work_YEAR>2;
        -- sql語句執行:先from,再where,再select
      12. 轉換函式

        -- 索引型別如果不一致會失效,age列是number,age=to_number('1')
        -- 日期到字元
        SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;
        -- 字元到日期
        SELECT to_date('2021-01-20 12:08:28','yyyy-mm-dd hh24:mi:ss') FROM dual;
        -- 字元到數字
        SELECT to_number('142') FROM dual;
        -- 數字到字元
        SELECT 1,to_char(1) FROM dual;