1. 程式人生 > >檢視、序列、索引、約束

檢視、序列、索引、約束

檢視

檢視(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約束中定義的條件