1. 程式人生 > >資料庫物件檢視、索引、遊標、觸發器簡介

資料庫物件檢視、索引、遊標、觸發器簡介

檢視

1.檢視概述

1) 檢視是什麼:

檢視是基於 SQL 語句的結果集的視覺化的表(虛擬表),一個檢視並不真正包含真實的資料,只是從另一個視角檢視或改變表裡的資料。

2) 檢視的作用:

檢視可以起到隱藏資料的功能,可以選擇性的顯示錶中的欄位和行(隱藏資料)

檢視可以將複雜的多表查詢的結果構成一個簡單的表結構給使用者(簡化開發)

2.檢視的使用

1)檢視建立

CREATE OR REPLACE  VIEW 檢視名 [(員工號,員工姓名,工資)] --別名列表必須和查詢欄位個數匹配
AS  
SELECT id, name,salary FROM emp WHERE salary>=7000 
[WITH CHECK OPTION]     --檢視的DML操作才用到,滿足上面的where條件(>=7000)的資料才能插入
[WITH READ ONLY] ;      --表示該檢視不可執行DML操作,預設是可以進行DML操作

2)查詢檢視

          查詢:SELECT * FROM emp_hiredate_view  WHERE "id" BETWEEN 200 AND 207; --從試圖中查詢員工id 200-201的員工
          查詢所有存在的檢視:SELECT * FROM USER_VIEWS

3)檢視的DML操作

對於簡單檢視(涉及到一個表,不包含函式,不包含分組)可以像普通表一樣進行DML操作

對於複雜檢視的DML操作是有條件的:

1) DML 操作不允許違反約束。

2)在包含組函式、GROUP BY 子句、ROWNUM偽列或DISTINCT關鍵字的檢視上不允許 DML 操作。

 

索引

1.索引概述

1)索引是什麼:

索引是資料庫物件,可以理解為是一本書的目錄,它記錄了資料在資料庫中存放的位置,就像一本書的目錄,記錄了某一頁在這本書的哪個位置。相同地,索引是一個單獨的、儲存在磁碟上的資料庫結構是實際存在的,它們包含著對資料庫表裡所有記錄的引用指標。

2)索引優缺點:

通過指標的形式提高查詢速度,索引提供了對錶中行的直接和快速的訪問,

但會帶來系統開銷(犧牲增刪改的速度換取查詢的速度(DML操作在物理表的同時也會維護索引表))

2.索引使用場景

1)適合加索引:

  1. 在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
  2. 經常需要搜尋的列上,可以加快搜索的速度; 
  3. 經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
  4. 經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。 

2)不適合加索引

  1. 對於那些在查詢中很少使用或者參考的列不應該建立索引
  2. 對於那些只有很少資料值的列也不應該增加索引
  3. 修改效能遠遠大於檢索效能時,不應該建立索引

3)索引的使用

語法:

CREATE [UNIQUE] INDEX index_name

ON table_name(column_name[,column_name…])

語法解析:

1. UNIQUE:指定索引列上的值必須是唯一的。稱為唯一索引。

2. index_name:指定索引名。

3. tabl_name:指定要為哪個表建立索引。

4. column_name:指定要對哪個列建立索引。我們也可以對多列建立索引;這種索引稱為組合索引。

CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME);  --為員工名建立唯一索引

CREATE INDEX IDX_SAL ON EMP(SAL);                --為工資建立普通索引

CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));   --將JOB列轉換為小寫後建立索引

 

3.複合索引

1)什麼是複合索引?
    索引可以包含一個、兩個或更多個列。兩個或更多個列上的索引被稱作 複合索引。
2)複合索引作用
    利用索引中的附加列,您可以縮小搜尋的範圍,但使用一個具有兩列的索引不同於使用兩個單獨的索引。

  複合索引的結構與電話簿類似,它首先按姓氏對僱員進行排序,然後按名字對所有姓氏相同的僱員進行排序。如果您知道姓氏,電話簿將非常有用,如果您知道名字和姓氏,電話簿則更為有用,但如果您只知道名字而不知道姓氏,電話簿將沒有用處。所以複合索引,欄位的先後順序是很重要的。
列的順序:在建立複合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜尋或僅對前幾列執行搜尋時,複合索引非常有用;僅對後面的任意列執行搜尋時,複合索引則沒有用處。

遊標

1.遊標概述

遊標是一個數據庫物件,是SQL一個記憶體工作區,主要用於暫時存放受SQL語句影響到的所有資料處理SQL結果集

2.遊標的屬性

  • %rowcount        遊標中包含的行數
  • %found             布林值,遊標是否還有資料
  • %notfount         布林,遊標是否已經沒有資料
  • %isopen            遊標是否開啟

3.遊標的使用

使用過程 :宣告遊標 開啟遊標 提取資料 關閉遊標

寫法一:

declare 
  CURSOR cemp is SELECT first_name,salary FROM employees;--宣告遊標
  pename employees.first_name%type;
  psal employees.salary%type;
begin
  open cemp; --開啟遊標
  loop       --提取資料
    fetch cemp into pename,psal;
    --退出條件,沒有提取到資料
    exit when cemp%notfound;
    dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
    close cemp;--關閉遊標
end;

寫法二使用增強for迴圈(可以省略開啟遊標等過程)

declare 
  CURSOR cemp is SELECT ename,sal FROM emp; --宣告遊標 cemp
  begin 
  for v_temp in cemp loop                   --提取資料
    if (v_temp.sal<2000) THEN --v_temp可以不用定義
      dbms_output.put_line(v_temp.ename||'原工資:'||v_temp.sal||', 漲後'||(v_temp.sal+500));--加括號
    elsif (v_temp.sal<5000) THEN  
      dbms_output.put_line(v_temp.ename||'原工資:'||v_temp.sal||', 漲後'||(v_temp.sal+300));
    else 
          dbms_output.put_line(v_temp.ename||'原工資:'||v_temp.sal||', 漲後'||(v_temp.sal+100));
    end if;
    end loop;
end;

觸發器

1.觸發器概述

觸發器是一個數據庫物件,是一個特殊的過程,當特定的事件發生時隱式的執行。比如一個表中發生插入刪除更新時會隱形的執行一些事件,在指定的時間內對一個表進行修改執行一些事件等。

2.應用場景

DDL DML 或者使用者登入資料庫關閉等操作時

3.觸發器組成部分

觸發時間:       BEFORE ,AFTER

觸發事件:       INSERT,UPDATE,DELETE等操作

觸發器型別:   Statement,now

觸發器體:       具體操作 具體PL/SQL

4.觸發器使用:

例子:當員工表的員工編號或者部門編號修改 後 觸發事件 向工作歷史表插入一條記錄

CREATE OR REPLACE TRIGGER update_job_history
AFTER 
UPDATE OF job_id,department_id
ON employees
FOR EACH ROW
BEGIN
INSERT INTO job_history(employee_id,start_date...)VALUES();
END;

 

如有問題,多多指正!