1. 修改、查詢、刪除記錄時都會提示多少條記錄被影響,但建表不會提示。當表的數據修改後反映到視圖。 修改、查詢、刪除視圖的命令跟建表時的一樣。 視圖是從一個或多個表(或視圖)導出的表。視圖是數據庫的用戶使用數據庫的觀點。可以根據他們的不同需求,在物理的數據庫上定義他們對數據庫所要求的數據結構,這種根據用戶觀點所定義的數據結構就是視圖。 視圖與表(有時為與視圖區別,也稱表為基本表——Base Table)不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。 視圖一經定義以後,就可以像表一樣被查詢、修改、刪除和更新。2.使用視圖有下列優點: (1)為用戶集中數據,簡化用戶的數據查詢和處理。有時用戶所需要的數據分散在多個表中,定義視圖可將它們集中在一起,從而方便用戶的數據查詢和處理。 www.2cto.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.2cto.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.2cto.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.2cto.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.2cto.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.2cto.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.2cto.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.2cto.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.2cto.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