1. 修改、查詢、刪除記錄時都會提示多少條記錄被影響,但建表不會提示。當表的數據修改後反映到視圖。算法
修改、查詢、刪除視圖的命令跟建表時的同樣。數據庫
視圖是從一個或多個表(或視圖)導出的表。視圖是數據庫的用戶使用數據庫的觀點。能夠根據他們的不一樣需求,在物理的數據庫上定義他們對數據庫所要求的數據結構,這種根據用戶觀點所定義的數據結構就是視圖。安全
視圖與表(有時爲與視圖區別,也稱表爲基本表——Base Table)不一樣,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,對視圖的數據進行操做時,系統根據視圖的定義去操做與視圖相關聯的基本表。數據結構
視圖一經定義之後,就能夠像表同樣被查詢、修改、刪除和更新。2.使用視圖有下列優勢:ide
(1)爲用戶集中數據,簡化用戶的數據查詢和處理。有時用戶所須要的數據分散在多個表中,定義視圖可將它們集中在一塊兒,從而方便用戶的數據查詢和處理。 www.2cto.com 函數
(2)屏蔽數據庫的複雜性。用戶沒必要了解複雜的數據庫中的表結構,而且數據庫表的更改也不影響用戶對數據庫的使用。測試
(3)簡化用戶權限的管理。只需授予用戶使用視圖的權限,而沒必要指定用戶只能使用表的特定列,也增長了安全性。.net
(4)便於數據共享。各用戶沒必要都定義和存儲本身所需的數據,可共享數據庫的數據,這樣一樣的數據只需存儲一次。設計
(5)能夠從新組織數據以便輸出到其餘應用程序中。rest
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。
轉載至http://blog.csdn.net/huangjianxiang1875/article/details/7882232