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