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

Oracle第五課

Oracle第五課

一、DQL(data query language)資料查詢語言

  • 單表查詢

    1. 分頁

      -- 偽列(物理不存在的列,Oracle對結果進行計算得到的臨時列)

      -- 分頁用到了偽列rownum,因為這個列是不穩定的,變化的,所以要把這個結果當作下一次查詢的資料(select e.*,rownum rn from emp e),這樣在下一個查詢中它就成了一個真實存在的列,就可以進行條件的限定

      -- 把偽列轉換為實列(用到了子查詢,把一個查詢作為另一個查詢的一部分就是子查詢,也叫巢狀查詢)
      -- 簡單分頁,不帶排序
      SELECT t.* FROM (SELECT e.*,ROWNUM rn FROM emp e) t WHERE t.rn>(n-1)*SIZE AND t.rn<=n*SIZE;
      -------------------------------
      SELECT t.* FROM (SELECT e.*,ROWNUM rn FROM emp e) t WHERE t.rn>(&n-1)*&SIZE AND t.rn<=&n*&SIZE;
      ------------------------------
      -- 帶排序的分頁,三層巢狀,&代表變數,在執行時可以賦值
      SELECT * FROM (SELECT t.*,ROWNUM rn FROM (SELECT e.* FROM emp e ORDER BY sal) t) o WHERE o.rn>(&n-1)*&SIZE AND o.rn<=&n*&SIZE;
    2. 分組(group by)

      -- 列表中的列一定要在group by後面的欄位中
      -- 按部門和工作進行分組
      SELECT deptno,job FROM emp GROUP BY deptno,job;
      -- 按工作進行分組
      SELECT job FROM emp GROUP BY job;
  • 多表查詢

    1. 內連線

      -- 標準寫法
      SELECT e.empno,e.ename,e.deptno,d.dname FROM emp e INNER JOIN dept d ON e.deptno= d.deptno;
      -- 常用寫法
      SELECT empno,ename,d.deptno,dname FROM emp e,dept d WHERE e.deptno=d.deptno;

      -- 因為兩張表中可能存在相同名稱的列,此時在sql語句中一定要表明該列是哪一個表,否則會報錯,如果列名可以明顯區分,則不需要標明是哪個表

      SELECT empno,ename,e.deptno,dname FROM emp e INNER JOIN dept d ON e.deptno= d.deptno;

      -- 上述sql中的deptno在兩張表中都有,所以一定要標明表

      -- 內連線的結果是一一對應,第一張表中的資料一定和第二張表中的資料有關聯。

    2. 左外連線

      -- 查詢的結果中會顯示左表和右表一一對應的記錄,並且還顯示左表中不對應的資料,重點是左表,就是要顯示左表中所有記錄

      SELECT empno,ename,d.deptno,dname FROM emp LEFT OUTER JOIN dept d ON emp.deptno = d.deptno;
    3. 右外連線

      SELECT e.empno,e.ename,d.deptno,dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;
    4. 全外連線

      SELECT e.empno,e.ename,d.deptno,dname FROM emp e FULL JOIN dept d ON e.deptno=d.deptno;

二、TCL(transaction contol language)事務控制語言

-- 設定標誌
savepoint p1;
-- 插入資料
insert into emp(empno) values(5);
-- 回滾到標誌處
rollback to p1;
-- 提交
commit

三、DCL(data control language)資料控制語言

  1. 建立角色

    create role 角色名;
  2. 分配許可權

    grant select on class to 角色名;

四、索引

    • 字典中有索引,書中有目錄

    • 快速查詢資料

    • 優點:DQL快速查詢,為了保證查詢速度,可以犧牲一定的空間和DML的操作時間

    • 缺點:佔空間(在儲存正常業務資料的同時,還要額外的儲存索引資訊),在維護正常業務資料的同時,還要維護索引的資料(佔時間)

    • 什麼情況下適合建立索引

      • 一個條件經常出現在where中,就要考慮是否要建立索引

      • 對於列中的資料區分度比較高的列也可以建立索引(反例:性別不適合)

      • 如果同時又多個查詢條件,where c1=a and c2 = b,建立聯合索引(c1,c2),索引中的列的順序和where條件中的順序儘量一致

        • 索引(c1,c2...)條件是where c1 = a and c2=b 這個是好的,條件是where c2=b這個不是特別理想,或者where c2=b and c1 = a這個也不好

    • 索引的分類

      • 聚集索引:會改變記錄的物理位置

      • 非聚集索引:資料的順序和它插入時的順序一致,在索引中儲存的是記錄的rowid,找到索引,然後找到rowid,然後找到記錄

      • name1row1
        name2 row3
        name3 row4
        name4 row2

        -- 上面的表格為非聚集索引表格,裡面儲存了rowid

        -- 姓名列在插入時的資料是name1,name4,name2,name3,建立索引後不會改變插入順序

        -- 在索引中的順序是name1,name2,name3,name4

        -- 要找name3,根據演算法在索引表裡找到name3對應的實體地址(row4),很快定位到name3這條記錄