資料庫物件檢視、索引、遊標、觸發器簡介
檢視
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)適合加索引:
- 在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
- 在經常需要搜尋的列上,可以加快搜索的速度;
- 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
- 在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
2)不適合加索引
- 對於那些在查詢中很少使用或者參考的列不應該建立索引
- 對於那些只有很少資料值的列也不應該增加索引
- 當修改效能遠遠大於檢索效能時,不應該建立索引
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;
如有問題,多多指正!