天天看點

《MySQL入門很簡單》學習筆記(8)之第8章視圖(關鍵詞:資料庫/MySQL/建立視圖/修改視圖/檢視視圖/删除視圖)第8章 視圖

第8章 視圖

視圖是從一個或多個表中導出來的表,是一種虛拟存在的表。
    視圖就像一個視窗,通過這個視窗可以看到系統專門提供的資料。
    使用者可以不用看到整個資料庫表中的資料,而隻關心對自己有用的資料。
    視圖可以使使用者的操作更友善,而且可以保障資料庫系統的安全性。
           

8.1 視圖簡介

視圖的作用是友善使用者對資料的操作。
           

8.1.1 視圖的含義

視圖是從一個或多個表中導出來的表,是一種虛拟存在的表。
    視圖還可以從已經存在的視圖的基礎上定義。
    資料庫中隻存放了視圖的定義,而并沒有存放視圖中的資料。這些資料存放在原來的表中。
    是以,視圖中的資料是依賴于原來的表中的資料的。
    一旦表中的資料發生改變,顯示在視圖中的資料也會發生改變。
    MySQL的視圖不支援輸入參數的功能,是以互動性上還有欠缺。但對于不是很大的操作,使用視圖可以很大程度上簡化使用者的操作。
           

8.1.2 視圖的作用

1.使操作簡單化
        視圖需要達到的目的就是所見即所需。
        視圖可以簡化對資料的操作。
    2.增加資料的安全性
        通過視圖,使用者隻能查詢和修改指定的資料。
        資料庫授權指令可以限制使用者的操作權限,但不能限制到特定行和列上。
        使用視圖,可以簡單友善地将使用者的權限限制到特定的行和列上。這樣可以保證一些機密資訊的安全。
    3.提高表的邏輯獨立性             
           

8.2 建立視圖

8.2.1 建立視圖的文法形式

文法形式:
    CREATE [ ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE} ]
             VIEW 視圖名 [( 屬性清單 )]
             AS SELECT 語句
             [ WITH  [ CASCADED | LOCAL ]  CHECK  OPTION ];
    建立視圖時,需要有CREATE VIEW的權限。同時,應該具有查詢涉及的列的SELECT權限。
    在MySQL資料庫下面的user表中儲存這些權限資訊,可以使用SELECT語句查詢。
    SELECT語句查詢的方式如下:
    SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='使用者名'
    詳細說明見書上。
           

8.2.2 在單表上建立視圖

建立視圖的代碼eg:
        CREATE VIEW department_view1
        AS SELECT * FROM department;
           

8.2.3 在多表上建立視圖

MySQL中也可以在兩個或兩個以上的表上建立視圖,也是使用CREATE VIEW語句實作的。
    例如:CREATE ALGORITHM=MERGE VIEW
                worker_view1 (name, department, sex, age, address)
                AS SELECT name, department.d_name, sex, 2009-birthday, address
                FROM worker, departmment, WHERE worker.d_id=department.d_id
                WITH LOCAL CHECK OPTION
           

8.3 檢視視圖

檢視視圖是指檢視資料庫中已存在的視圖的定義。
    檢視視圖必須要有SHOW VIEW的權限,MySQL資料庫下的user表中儲存着這個資訊。       
    檢視視圖的方法:
        DESCRIBE
        SHOW TABLE STATUS
        SHOW CREATE VIEW
    查詢information_schema資料庫下的views表等。
           

8.3.1 DESCRIBE語句檢視視圖基本資訊

基本形式:
        DESCRIBE 視圖名;
    eg:
        DESCRIBE worker_view1;
           

8.3.2 SHOW TABLE STATUS語句檢視視圖基本資訊

文法:
        SHOW TABLE STATUS LIKE '視圖名';
    eg:
        SHOW TABLE STATUS LIKE 'worker_view1';
           

8.3.3 SHOW CREATE VIEW語句檢視視圖詳細資訊

文法:
        SHOW CREATE VIEW 視圖名;
    eg:
        SHOW CREATE VIEW worker_view1;
           

8.3.4 在views表中檢視視圖詳細資訊

SELECT * FROM information_schema.views;
           

8.4 修改視圖

修改視圖是指修改資料庫中已存在的表的定義。
    當基本表的某些字段發生改變時,可以通過修改視圖來保持視圖和基本表之間一緻。
    MySQL中通過CREATE OR REPLACE VIEW語句和ALTER語句來修改視圖。
           

8.4.1 CREATE OR REPLACE VIEW語句修改視圖

CREATE OR REPLACE VIEW的使用非常靈活:
    在視圖已經存在的情況下,對視圖進行修改;
    視圖不存在時,可以建立視圖。
    文法:
        CREATE OR REPLACE  [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE} ]
                             VIEW 視圖名 [( 屬性清單 )]
                             AS SELECT 語句
                             [ WITH  [CASCADED | LOCAL ]  CHECK  OPTION];
                             CREATE  OR  REPLACE  ALGORITHM=TEMPLATE
                             VIEW  department_view1 (department, function, location )
                             AS  SELECT d_name, function, address  FROM department;
           

8.4.2 ALTER語句修改視圖

在MySQL中,ALTER語句的作用:
        修改表的定義;
        建立索引;
        修改視圖。
    文法:
        ALTER  [ ALGORITHM={UNDEFINED | MERGE | TEMPTABLE} ]
                 VIEW 視圖名 [( 屬性清單 )]
                 AS  SELECT 語句
                 [ WITH  [ CASCADED | LOCAL ]   CHECK  OPTION ];
           

8.5 更新視圖

更新視圖是指通過視圖來插入(INSERT)、更新(UPDATE)、删除(DELETE)表中的資料。
    因為視圖是一個虛拟表,是以其中沒有資料。
    通過視圖更新時,都是轉換到基本表來更新。
    更新視圖時,隻能更新權限範圍内的資料,超出了範圍,就不能更新。
    注意:
    視圖中雖然可以更新資料,但是有很多限制。
    一般情況下,最好将視圖作為查詢資料的虛拟表,而不要通過視圖更新資料。
    因為,使用視圖更新資料時,如果沒有全面考慮在視圖中更新資料的限制,可能會造成資料更新失敗。
           

8.6 删除視圖

删除視圖時,隻能删除視圖的定義,不會删除資料。
    MySQL中,使用DROP VIEW來删除視圖。但是使用者必須擁有DROP權限。
    文法:
        DROP VIEW [IF EXISTS] 視圖名清單 [RESTRICT  |  CASCADE]
    其中,IF EXISTS參數指判斷視圖存在,如果存在則執行,不存在則不執行;“視圖名清單”參數表示要删除的視圖的名稱的清單。
           

8.8 常見問題及解答

1.MySQL中視圖和表的差別及聯系是什麼?
        差別:
        (1)視圖是按照SQL語句生成的一個虛拟的表;
        (2)視圖不占實際的實體空間,而表中的記錄需要占實體空間;
        (3)建立和删除視圖隻影響視圖本身,不會影響實際的記錄。而建立和删除表會影響實際的記錄。
        聯系:
        (1)視圖是建立在表之上的表,其字段和記錄都來自基本表,其依賴基本表而存在;
        (2)一個視圖可以對應一個基本表,也可以對應多個基本表;
        (3)視圖是基本表的抽象,在邏輯意義上建立的新關系。
    2.為什麼視圖更新不了?
    可能的原因:
        視圖中包含SUM()、COUNT()、MAX()、MIN()等函數;
        視圖中包含UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等關鍵字;
        視圖是一個常量視圖,而且該列沒有包含在視圖中等。
           

參考文獻:

1.《MySQL入門很簡單》。