檢視、序列、索引、約束
檢視
檢視(VIEW)也被稱作虛表,即虛擬的表,是一組資料的邏輯表示。
檢視對應於一條SELECT語句,結果集被賦予一個名字,即檢視名字。
檢視本身並不包含任何資料,它只包含對映到基表的一個查詢語句,當基表資料發生變化,檢視資料也隨之變化。
語法:
CREATE [OR REPLACE] VIEW view_name[(alias[,alias…])] AS subquery;
·檢視建立後,可以像操作表一樣操作檢視,主要是查詢
·Subquery是SELECT查詢語句,對應的表被稱為基表
·根據檢視所對應的子查詢種類分為幾種型別:
--SELECT語句是基於單表建立的,且不包含任何函式運算、表示式或分組函式,叫做簡單檢視,此時檢視是基表的子集。
--SELECT語句同樣是基於單表,但包含了單行函式、表示式、分組函式或GROUP BY子句,叫做複雜檢視。
--SELECT語句是基於多個表的,叫做連線檢視。
檢視的作用:
·如果需要經常執行某項複雜查詢,可以基於這個複雜查詢建立檢視,此後查詢此檢視即可,簡化複雜查詢。
·檢視本質上就是一條SELECT語句,所以當訪問檢視時,只能訪問到所對應的SELECT語句中涉及到的列,對基表中的其他列起到安全和保密的作用,限制資料訪問
授權建立檢視
·建立檢視的語句是CREATE VIEW,使用者必須擁有CREATE VIEW系統許可權,才能建立檢視,如果沒有許可權,會顯示許可權不足。管理員可以通過DCL語句授予使用者建立檢視的許可權:
GRANT CREATE VIEW TO 使用者名稱;
對檢視進行DML操作
·檢視本身並不包含資料,只是基表資料的邏輯對映
·當對檢視執行DML操作時,實際上是對基表的DML操作
·對檢視執行DML操作的基本原則:
---簡單檢視能夠執行DML操作,下列情況除外:在基表中定義了非空列,但簡單檢視對應的SELECT語句並沒有包含這個非空列,導致這個非空列對檢視不可見,這時無法對檢視執行INSERT操作。
---DELETE操作時,只能刪除現有視圖裡能查到的記錄。
---如果檢視定義中包含了函式、表示式、分組語句、DISTINCT關鍵字或ROWNUM偽列,不允許執行DML操作。
---DML操作不能違反基表的約束條件。
建立具有CHECK OPTION約束的檢視
語法:CREATE[OR REPLACE] VIEW view_name[(alias[,alias…])]
AS Subquery WITH CHECK OPTION;
WITH CHECK OPTION語句表示:通過檢視所做的修改。
假設INSERT,新增的記錄在檢視仍可檢視。
假設UPDATE,修改後的結果必須能通過檢視檢視到。
建立具有READ ONLY約束的檢視
語法:CREATE[OR REPLACE] VIEW view_name[(alias[,alias…])]
AS Subquery WITH READ ONLY;
·對簡單檢視進行DML操作是合法的,但是不安全。
·如果沒有在檢視上執行DML操作的必要,在建立檢視時宣告為只讀來避免這種情況,保證檢視對應的基表資料不會被非法修改。
通過查詢user_views獲取相關資訊
·和檢視相關的資料字典
---USER_OBJECTS
---USER_VIEWS
---USER_UPDATE_COLUMNS
·在資料字典USER_OBJECTS中查詢所有檢視名稱
SELECT object_name FROM user_objects WHERE object_type =’VIEW’;
建立複雜檢視
·複雜檢視指在子查詢中包含了表示式、單行函式或分組函式的檢視。
·必須為子查詢中的表示式或函式定義別名。
·複雜檢視不允許DML操作。
序列
·序列是一種用來生成唯一數字值的資料庫物件。
·序列的值由Oracle程式按遞增或遞減順序自動生成,通常來自動產生表的主鍵值,是一種高效率獲得唯一鍵值的途徑。
·序列是獨立的資料庫物件,和表是獨立的物件,序列並不依附於表。
·通常情況下,一個序列為一個表提供主鍵值,但一個序列也可以為多個表提供主鍵值。
建立序列
CREATE SEQUENCE [schema.] sequence_name [START WITH i][INCREMENT BY j] [MAXVALUE m|NOMAXVALUE] [MINVALUE n|NOMINVALUE] [CYCLE|NOCYCLE][CACHE p|NOCACHE] |
·sequence_name是序列名,將建立在schema方案下
·序列的第一個序列值是i,步進是j
·如果j是正數,表示遞增,如果是負數,表示遞減
·序列可生成的最大值是m,最小值是n
·如果沒有設定任何可選引數,序列的第一個值是1,步進是1
·CYCLE表示在遞增至最大值或遞減至最小值之後是否重用序列。若是遞減並有最大值,從最大值開始。若是遞增並有最小值,從最小值開始。若沒有從START WITH指定的值開始。預設是NOCYCLE
·CACHE用來指定先預取p個數據在快取中,以提高序列值的生成效率,預設是20
使用序列
·序列中有兩個偽列
---NEXTVAL:獲取序列的下個值
---CURRVAL:獲取序列的當前值
·當序列建立之後,必須先執行一次NEXTVAL,之後才能使用CURRVAL
刪除序列
·語法:DROP SEQUENCE sequence_name;
索引
·索引是一種允許直接訪問資料表中某一資料行的樹型結構,為了提高查詢效率而引入,是獨立於表的物件,可以存放在與表不同的表空間(TABLESPACE)中
·索引記錄中存有索引關鍵字和指向表中資料的指標(地址)
·對索引進行的I/O操作比對標進行操作要少很多
·索引一旦被建立就被Oracle系統自動維護,查詢語句中不用指定使用哪個索引
·索引是一種提高查詢效率的機制
建立索引
·語法:
CREATE [UNIQUE] INDEX index_name ON table(column[,column…]); ---index_name表示索引名稱 ---table表示表名 ---column表示列名,可以建立單列索引或複合索引 ---UNIQUE表示唯一索引 ---注:索引中出現的列都是在查詢中where子句中經常出現的列 |
複合索引也叫作多列索引,是基於多個列的索引
·如果經常在ORDER BY子句中使用job和sal作為排序依據,可以建立複合索引;
CREATE INDEX idx_emp_job_sal ON emp(job,sal)
·當做下面的查詢時,會自動應用索引idx_emp_job_sal:
SELECT empno,ename,sal,job FROM emp ORDER BY job,sal;
建立基於函式的索引
·如果需要在emp表的ename列上執行大小寫無關搜尋,可以在此列建立一個基於UPPER函式的索引:
CREATE INDEX emp_ename_upper_idx ON emp(Upper(uname)); |
修改和刪除索引
·如果經常在索引列上執行DML操作,需要定期重建索引,提高索引的空間利用率;
ALTER INDEX index_name REBUILD;
·當一個表上有不合理的索引,會導致操作效能下降,刪除索引的語法:
DROP INDEX index_name;
合理使用索引提升查詢效率
·為經常出現在WHERE子句中的列建立索引
·為經常出現在ORDER BY、DISTINCT後面的欄位建立索引。如果建立的是複合索引,索引的欄位順序要和這些關鍵字後面的欄位順序一致
·為經常作為表的連線條件的列上建立索引
·不要在經常做DML操作的表上建立索引
·不要在小表上建立索引
·限制表上的索引數目,索引並不是越多越好
·刪除很少被使用的、不合理的索引
約束
作用:
·約束(CONSTRAINT)的全稱是約束條件,也稱作完整性約束條件
·約束是在資料表上強制執行的一些資料校驗規則,當執行DML操作時,資料必須符合這些規則,如果不符合則無法執行
·約束條件可以保證表中資料的完整性,保證資料間的商業邏輯
約束條件包括:
---非空約束(Not Null),簡稱NN(列級約束)
---唯一性約束(Unique),簡稱UK(列級約束、表級約束)
·唯一性(Unique)約束條件用於保證欄位或者欄位的組合不出現重複值
·當給表的某個列定義了唯一性約束,該列的值不允許重複,但允許是NULL值
·唯一性約束條件可以在建表同時建立,也可以在建表以後再建立
---主鍵約束(Primary Key),簡稱PK
·主鍵(Primary Key)約束條件從功能上看相當於非空(NOT NULL)且唯一(UNIQUE)的組合
·主鍵欄位可以是單欄位或多欄位組合,即:在主鍵約束下的單欄位或者多欄位組合上不允許有空值,也不允許有重複值
·主鍵可以用來在表中唯一的確定一行資料
·一個表上只允許建立一個主鍵,而其他約束條件則沒有明確的個數限制
主鍵選取的原則:
·主鍵應是對系統無意義的資料
·永遠也不要更新主鍵,讓主鍵除了唯一標識一行之外,再無其他的用途
·主鍵不應包含動態變化的資料,如時間戳
·主鍵應自動生成,不要人為干預,以免使它帶有除了唯一標識一行以外的意義
·主鍵儘量建立在單列上
---外來鍵約束(Foreign Key),簡稱FK
·意義:定義在兩個表的欄位或一個表的兩個欄位上,用於保證相關兩個欄位的關係
外來鍵約束對唯一性的維護
·從表上定義的外來鍵的列值,必須從主表被參照的列值中選取,或者為NULL
·當主表參照列的值被從表參照時,主表的該行記錄不允許被刪除
外來鍵約束對效能的降低
·如果在一個頻繁DML操作的表上建立外來鍵,每次DML操作,都將導致資料庫自動對外來鍵所關聯的對應表作檢查,產生開銷,如果已在程式中控制邏輯,這些判斷將增加額外負擔,可以省去
·外來鍵確定了主從表的先後生成關係,有時會影響業務邏輯
關聯不一定需要外來鍵約束
·保證資料完整性可由程式或觸發器控制
·簡化開發,維護資料時不用考慮外來鍵約束
·大量資料DML操作時不需要考慮外來鍵耗費時間
---檢查約束(Check),簡稱CK
·檢查(Check)約束條件用來強制在欄位上的每個值都要滿足Check中定義的條件
·當定義了Check約束的列新增或修改資料時,資料必須符合Check約束中定義的條件