MySQl心得4–5–數據庫視圖

 

1.   修改、查詢、刪除記錄時都會提示多少條記錄被影響,但建表不會提示。當表的數據修改後反映到視圖。

 

     修改、查詢、刪除視圖的命令跟建表時的一樣。

 

視圖是從一個或多個表(或視圖)導出的表。視圖是數據庫的用戶使用數據庫的觀點。可以根據他們的不同需求,在物理的數據庫上定義他們對數據庫所要求的數據結構,這種根據用戶觀點所定義的數據結構就是視圖。

 

視圖與表(有時為與視圖區別,也稱表為基本表——Base Table)不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中隻存儲視圖的定義,對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。

 

視圖一經定義以後,就可以像表一樣被查詢、修改、刪除和更新。2.使用視圖有下列優點:

 

(1)為用戶集中數據,簡化用戶的數據查詢和處理。有時用戶所需要的數據分散在多個表中,定義視圖可將它們集中在一起,從而方便用戶的數據查詢和處理。  www.aiwalls.com  

 

(2)屏蔽數據庫的復雜性。用戶不必瞭解復雜的數據庫中的表結構,並且數據庫表的更改也不影響用戶對數據庫的使用。

 

(3)簡化用戶權限的管理。隻需授予用戶使用視圖的權限,而不必指定用戶隻能使用表的特定列,也增加瞭安全性。

 

(4)便於數據共享。各用戶不必都定義和存儲自己所需的數據,可共享數據庫的數據,這樣同樣的數據隻需存儲一次。

 

(5)可以重新組織數據以便輸出到其他應用程序中。

 

3. 使用create view語句創建視圖

 

語法格式:

 

CREATE [re replace] [algorithm = {undefined | merge | temptable}]  view 視圖名[(column_list)]

 

 as select_statement  [with [cascaded| local] check option]

 

例:create view v_xs

 

as select *from xs;(在xsdb庫下創建)

 

|xsdb.xs(在飛xsdb庫下建xsdb裡的表的視圖)

 

說明:

 

●  column_list:要想為視圖的列定義明確的名稱,可使用可選的column_list子句,列出由逗號隔開的列名。column_list中的名稱數目必須等於SELECT語句檢索的列數。若使用與源表或視圖中相同的列名時可以省略column_list。  www.aiwalls.com  

 

●  or replace:給定瞭OR REPLACE子句,語句能夠替換已有的同名視圖。

 

●  algorithm子句:可選的ALGORITHM子句是對標準SQL的MySQL擴展,規定瞭MySQL的算法,算法會影響MySQL處理視圖的方式。ALGORITHM可取3個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。指定瞭MERGE選項,會將引用視圖的語句的文本與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分。MERGE算法要求視圖中的行和基表中的行具有一對一的關系,如果不具有該關系,必須使用臨時表取而代之。指定瞭TEMPTABLE選項,視圖的結果將被置於臨時表中,然後使用它執行語句。

 

●   select_statement:用來創建視圖的SELECT語句,可在SELECT語句中查詢多個表或視圖。但對SELECT語句有以下的限制:

 

(1)定義視圖的用戶必須對所參照的表或視圖有查詢(即可執行SELECT語句)權限;

 

(2)不能包含FROM子句中的子查詢;

 

(3)不能引用系統或用戶變量;

 

(4)不能引用預處理語句參數;

 

(5)在定義中引用的表或視圖必須存在;

 

(6)若引用不是當前數據庫的表或視圖時,要在表或視圖前加上數據庫的名稱;

 

(7)在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進行瞭選擇,而該視圖使用瞭具有自己ORDER BY的語句,則視圖定義中的ORDER BY將被忽略。

 

(8)對於SELECT語句中的其他選項或子句,若視圖中也包含瞭這些選項,則效果未定義。例如,如果在視圖定義中包含LIMIT子句,而SELECT語句使用瞭自己的LIMIT子句,MySQL對使用哪個LIMIT未做定義。

 

●   WITH CHECK OPTION:指出在可更新視圖上所進行的修改都要符合select_statement所指定的限制條件,這樣可以確保數據修改後,仍可通過視圖看到修改的數據。當視圖是根據另一個視圖定義的時,WITH CHECK OPTION給出兩個參數:LOCAL和CASCADED。它們決定瞭檢查測試的范圍。Local關鍵字使CHECK OPTION隻對定義的視圖進行檢查,cascaded則會對所有視圖進行檢查。如果未給定任一關鍵字,默認值為CASCADED。

 

4. 註意,使用視圖時,要註意下列事項:

 

(1)在默認情況下,將在當前數據庫創建新視圖。要想在給定數據庫中明確創建視圖,創建時,應將名稱指定為db_name.view_name。  www.aiwalls.com  

 

(2)視圖的命名必須遵循標志符命名規則,不能與表同名,且對每個用戶視圖名必須是唯一的,即對不同用戶,即使是定義相同的視圖,也必須使用不同的名字。

 

(3)不能把規則、默認值或觸發器與視圖相關聯。

 

(4)不能在視圖上建立任何索引,包括全文索引。

 

5.例1: 假設當前數據庫是TEST,創建XSCJ數據庫上的CS_KC視圖,包括計算機專業各學生的學號、其選修的課程號及成績。要保證對該視圖的修改都要符合專業名為計算機這個條件。

 

CREATEOR REPLACE VIEW  XSCJ.CS_KC

 

       AS  SELECT XS.學號,課程號,成績

 

       FROMXSCJ.XS,  XSCJ.XS_KC

 

       WHERE  XS.學號 = XS_KC.學號 AND XS.專業名 = '計算機'  WITH CHECK OPTION;

 

例2: 查找平均成績在80分以上的學生的學號和平均成績。

 

本例首先創建學生平均成績視圖XS_KC_AVG,包括學號(在視圖中列名為num)和平均成績(在視圖中列名為score_avg)。  www.aiwalls.com  

 

創建學生平均成績視圖XS_KC_AVG:

 

CREATEVIEW XS_KC_AVG ( num,score_avg )

 

    AS  SELECT 學號, AVG(成績)

 

    FROMXS_KC  GROUP BY 學號;

 

再對XS_KC_AVG視圖進行查詢。

 

SELECT* FROM XS_KC_AVG

 

    WHEREscore_avg>=80;

 

從以上兩例可以看出,創建視圖可以向最終用戶隱藏復雜的表連接,簡化瞭用戶的SQL程序設計。

 

註意:使用視圖查詢時,若其關聯的基本表中添加瞭新字段,則該視圖將不包含新字段。例如,視圖CS_XS中的列關聯瞭XS表中所有列,若XS表新增瞭“籍貫”字段,那麼CS_XS視圖中將查詢不到“籍貫”字段的數據。

 

如果與視圖相關聯的表或視圖被刪除,則該視圖將不能再使用。

 

6.  可更新視圖

 

要通過視圖更新基本表數據,必須保證視圖是可更新視圖,即可以在INSET、UPDATE或DELETE等語句當中使用它們。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。還有一些特定的其他結構,這類結構會使得視圖不可更新。

 

如果視圖包含下述結構中的任何一種,那麼它就是不可更新的:

  www.aiwalls.com  

(1)聚合函數;

 

(2)DISTINCT關鍵字;

 

(3)GROUP BY子句;

 

(4)ORDER BY子句;

 

(5)HAVING子句;

 

(6)UNION運算符;

 

(7)位於選擇列表中的子查詢;

 

(8)FROM子句中包含多個表;

 

(9)SELECT語句中引用瞭不可更新視圖;

 

(10)WHERE子句中的子查詢,引用FROM子句中的表;

 

(11)ALGORITHM 選項指定為TEMPTABLE(使用臨時表總會使視圖成為不可更新的)。

 

7.  插入數據

 

使用INSERT語句通過視圖向基本表插入數據

 

例: 創建視圖CS_XS,視圖中包含計算機專業的學生信息,並向CS_XS視圖中插入一條記錄:('081255','李牧','計算機',1,'1990-10-21',50,NULL,NULL)。

 

首先創建視圖CS_XS:(以下的刪除、修改都是用該表)

 

CREATEOR REPLACE VIEW CS_XS

  www.aiwalls.com  

      AS  SELECT* FROM XS

 

      WHERE 專業名 = '計算機'  WITH CHECK OPTION;

 

註意:在創建視圖的時候加上WITH CHECK OPTION子句,是因為WITH CHECK OPTION子句會在更新數據的時候檢查新數據是否符合視圖定義中WHERE子句的條件。WITH CHECKOPTION子句隻能和可更新視圖一起使用。

 

接下來插入記錄:

 

INSERTINTO CS_XS

 

     VALUES('081255', '李牧', '計算機', 1, '1990-10-14',50, NULL, NULL);

 

註意:這裡插入記錄時專業名隻能為“計算機”。

 

這時,使用SELECT語句查詢CS_XS視圖和基本表XS,就可發現XS表中該記錄已經被添加。

 

當視圖所依賴的基本表有多個時,不能向該視圖插入數據,因為這將會影響多個基本表。例如,不能向視圖CS_KC插入數據,因為CS_KC依賴兩個基本表:XS和XS_KC。

 

對INSERT語句還有一個限制:SELECT語句中必須包含FROM子句中指定表的所有不能為空的列。例如,若CS_XS視圖定義的時候不加上“姓名”字段,則插入數據的時候會出錯。

  www.aiwalls.com  

8.  修改數據

 

使用UPDATE語句可以通過視圖修改基本表的數據

 

例: 將CS_XS視圖中所有學生的總學分增加8。

 

UPDATECS_XS SET 總學分 = 總學分+ 8;

 

該語句實際上是將CS_XS視圖所依賴的基本表XS中所有記錄的總學分字段值在原來基礎上增加8。

 

若一個視圖依賴於多個基本表,則一次修改該視圖隻能變動一個基本表的數據。

 

例: 將CS_KC視圖中學號為081101的學生的101課程成績改為90。

 

UPDATECS_KC  SET 成績=90

 

    WHERE 學號='081101' AND 課程號='101';

 

本例中,視圖CS_KC依賴於兩個基本表:XS和XS_KC,對CS_KC視圖的一次修改隻能改變學號(源於XS表)或者課程號和成績(源於XS_KC表)。

 

以下的修改是錯誤的:

 

UPDATECS_KC  SET 學號='081120',課程號='208'

  www.aiwalls.com  

 WHERE 成績=90;

 

9.  刪除數據

 

使用DELETE語句可以通過視圖刪除基本表的數據

 

例: 刪除CS_XS中女同學的記錄。

 

DELETEFROM CS_XS  WHERE 性別 = 0;

 

註意:對依賴於多個基本表的視圖,不能使用DELETE語句。例如,不能通過對CS_KC視圖執行DELETE語句而刪除與之相關的基本表XS及XS_KC表的數據。

 

10.使用ALTER語句可以對已有視圖的定義進行修改。

 

語法格式:

 

ALTER[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

 

    VIEW view_name [(column_list)]  AS select_statement

 

    [WITH [CASCADED | LOCAL] CHECK OPTION]

 

ALTERVIEW語句的語法和CREATE VIEW類似

 

例: 將CS_XS視圖修改為隻包含計算機專業學生的學號、姓名和總學分。

 

USEXSCJ;

 

ALTERVIEW CS_XS

 

AS  SELECT 學號,姓名,總學分  FROM XS

 

      WHERE 專業名 = '計算機';

 

11.  使用SQL語句刪除視圖

  www.aiwalls.com  

語法格式:

 

dropVIEW [IF EXISTS] 視圖名1 [,視圖名2]…

 

    [RESTRICT | CASCADE]

 

聲明瞭IF EXISTS,若視圖不存在的話,也不會出現錯誤信息。也可以聲明restrict和cascade,但它們沒什麼影響。

 

使用DROP VIEW一次可刪除多個視圖。例如:

 

DROP VIEW CS_KC, CS_XS;將刪除視圖CS_KC和CS_XS。

 

 

 

作者 tianyazaiheruan

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *