程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQl心得4--5--數據庫視圖

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

編輯:MySQL綜合教程

  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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved