視圖(簡介,創建,查看,修改,更新,刪除)


一、視圖簡介

視圖是從一個或多個表中導出來的表,是一種虛擬存在的表。視圖就像一個窗口,通過這個窗口可以看到系統專門提供的數據。用戶可以不用看到數據庫中的數據,而只關心對自己有用的數據。視圖可以使用戶的操作更方便,而且可以保障數據庫系統的安全性。

1、視圖的含義

視圖是一種虛擬的表,是從數據庫中的一個表或多個表中導出來的表,視圖還可以從已經存在的視圖的基礎上定義。數據庫只存放了視圖的定義,而並沒有存放視圖中的數據。這些數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。因此,視圖中的數據依賴於原來的表中的數據的。一旦表中的數據發生改變,顯示在視圖中的數據也會發生改變。

2、視圖的作用

視圖是在原有的表或者視圖的基礎上重新定義的虛擬表,這可以從原有的表上選取對用戶有用的信息。視圖起着類似於篩選的作用。

2.1 使用操作簡單化,視圖需要達到的目的就是所見即所需。

2.2 增加數據的安全性,通過視圖,用戶只能查詢和修改指定的數據。

2.3 提高表的邏輯獨立性,視圖可以屏蔽原有表結構變化帶來的影響。

 

二、創建視圖

 

創建視圖是指已存在的數據庫上建立視圖。視圖可以建立在一張表或多張表中。

 

1、創建視圖的語法形式

 

MySQL中,創建視圖是通過 SQL 語句 CREATE VIEW 實現的。其基本語法如下:

 

CREATE  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

 

  VIEW  視圖名  [(屬性清單)]

 

  AS  SELECT  語句

 

  [WITH  [CASCADED | LOCAL]  CHECK  OPTION];

 

其中,ALGORITHM 是可選參數,表示視圖選擇的算法;視圖名  參數表示創建的視圖的名稱;屬性清單  是可選參數,其指定了視圖中各個屬性的名詞,默認情況下與 SELECT 語句中查詢的屬性相同;SELECT 語句參數是一個完整的查詢語句,表示從某個表中查出某些滿足條件的記錄,將這些記錄導入視圖中;WITH  CHECK  OPTION 是可選參數,表示更新視圖時要保證在該視圖的權限范圍之內。

 

ALGORITHM  包括 3 個選項  UNDEFINEDMERGE TEMPTABLE。其中,UNDEFINED 選項表示MySQL 將自動選擇所要使用的算法;MERGE 選項表示將使用視圖的語句與視圖的定義合並起來,使得視圖定義的某一部分取代語句的對應部分;TEMPTABLE 選項表示將視圖的結果存入臨時表,然后使用臨時表執行語句。

 

CASCADED 是可選參數,表示更新視圖時要滿足所有相關視圖和表的條件,該參數為默認值;LOCAL 表示更新視圖時,要滿足該視圖本身的定義的條件即可。

 

CREATE VIEW 創建視圖時,最好加上WITH CHECK OPTION 參數。而且最好加上CASCADED 參數。這樣,從視圖上派生出來的新視圖后,更新新視圖需要考慮其父視圖的約束條件。這種方式比較嚴格,可以保證數據的安全性。

 

創建視圖時,需要有 CREATE VIEW 的權限。同時,應該具有查詢涉及的列的 SELECT 權限。SELECT 語句查詢方式如下:

 

SELECT   Select_priv,Create_view_priv  FROM  mysql.user  WHERE  user='用戶名'

 

其中,Select_priv 屬性表示用戶是否具有 SELECT 權限,Y表示擁有 SELECT 權限,N 表示沒有;,Create_view_priv 屬性表示用戶是否具有 CREATE VIEW 權限;mysql.user 表示MySQL數據庫下面的user表;用戶名  參數表示要查詢的那個用戶是否擁有前面列舉的權限,該參數用單引號引起來。

 

1.1 在單表上創建視圖

 

mysql> CREATE VIEW index2_view AS SELECT * FROM index2; index2 表上創建名稱為index2_view的視圖。

 

mysql> CREATE VIEW index1_view(v_id,name,sex) AS SELECT id,name,sex FROM index1; index1表上創建index1_view的視圖。

 

mysql> desc index1_view; 查看剛index1_view視圖。

 

1.2 在多表上創建視圖

 

mysql> CREATE ALGORITHM=MERGE VIEW

 

    -> worker_view(name,department,sex,age,address)

 

    -> AS SELECT name,department.d_name,sex,2009-brithday,address

 

    -> FROM worker,department WHERE worker.d_id= department.d_id

 

    -> WITH LOCAL CHECK OPTION;

 

三、查看視圖

查看視圖是指查看數據庫中已存在的視圖的定義。查看視圖必須要有的SHOW  VIEW 的權限,MySQL數據庫下的user表中保存着這個信息。查看視圖的方法包括 DESCRIBE 語句、SHOW TABLE STATUS 語句、SHOW CREATE VIEW 語句和查詢information_schema數據庫下的views 表等。

1DESCRIBE語句查看視圖基本信息

因為,視圖也是一張表。只是這張表比較特殊,是一張虛擬的表。同樣可以使用DESCRIBE語句查看視圖。基本語法如下:

DESCRIBE  視圖名; 其中,視圖名   參數指所要查看的視圖的名稱。

DESC   worker_view; 查看worker_view視圖基本信息。

2SHOW TABLE STATUS  語句查看視圖基本信息

基本語法: SHOW  TABLE  STATUS LIKE  '視圖'  ; 其中,LIKE  表示后面匹配的是字符串;視圖名  參數指要查看的視圖的名稱,需要用單引號引起來。

mysql> SHOW TABLE STATUS LIKE 'index1_view' \G 查看視圖index1_view,加上\G 查看的格式更整齊。

3SHOW CREATE VIEW 語句查看視圖詳細信息

基本語法: SHOW  CREATE  VIEW  視圖名

mysql> SHOW CREATE VIEW index2_view1; 這個查看視圖顯示數據有點亂

mysql> SHOW CREATE VIEW index2_view1 \G 查看視圖信息顯示整齊

4、在views 表中查看視圖詳細信息

MySQL 中,所有視圖的定義都存在 information_schema 數據庫下的 views 表中。查詢views 表,可以查看到數據庫中所有視圖的詳細信息。

基本語法: SELEC  *  FROM  information_schema.views;

mysql> SELECT * FROM information_schema.views \G

 

四、修改視圖

修改視圖是指修改數據庫中已存在的表的定義。當基本表的某些字段發生改變時,可以通過修改視圖來保持視圖和基本表之間一致。

1CREATE   OR  REPLACE  VIEW  語句修改視圖

基本語法(所有參數都與創建視圖的參數是一樣的)如下:

CREATE  OR  REPLACE  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIE  視圖名  [(屬性清單)]

AS  SELECT  語句

[WITH  [CASCADED | LOCAL ]  CHECK  OPTION];

修改index1_view視圖,修改后可以使用DESC查看效果

mysql> CREATE OR REPLACE ALGORITHM=TEMPTABLE

    -> VIEW index1_view(v_name,v_sex)

    -> AS SELECT name,sex FROM index1;

2ALTER 語句修改視圖

ALTER語句可以修改表的定義,創建索引,還可以用來修改視圖。基本語法(所有參數都跟創建視圖的參數是一樣的)

ALTER  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIEW  視圖名  [(屬性清單)]

AS  SELECT 語句

[WITH  [CASCADED | LOCAL]  CHECK  OPTION];

mysql> ALTER VIEW department_view2(department,name,sex,location)

    -> AS SELECT d_name,worker.name,worker.sex,address

    -> FROM department,worker WHERE department.d_id=work.d_id

    -> WITH CHECK OPTION;

 

五、更新視圖

更新視圖是指通過視圖來插入(INSERT)、更新(UPDATE) 和刪除(DELETE) 表中的數據。因為視圖是一個虛擬表,其中沒有數據,通過視圖更新時,都是轉換到基本表來更新。更新視圖時,只能更新權限范圍內的數據。

mysql> create databases test2; 創建數據庫test2

mysql> CREATE TABLE department(d_id INT PRIMARY KEY,

    -> d_name VARCHAR(20),

    -> function VARCHAR(100),

    -> address VARCHAR(50)

    -> ); 創建department

mysql> INSERT INTO department(d_id,d_name,function,address) VALUES(1001,"ministry of personnel","Management personnel change","3 floor, tower "); 在表department中插入一行

mysql> INSERT INTO department(d_id,d_name,function,address) VALUES(1002,"ministry of personnel",,"In charge of production","1 floor, tower 5"); 在表department中再插入一行

mysql> SELECT * FROM department; 查看來自於department的信息

+------+-----------------------+-----------------------------+------------------+

| d_id | d_name                | function                    | address          |

+------+-----------------------+-----------------------------+------------------+

| 1001 | ministry of personnel | Management personnel change | 3 floor, tower   |

| 1002 | ministry of personnel | In charge of production     | 1 floor, tower 5 |

+------+-----------------------+-----------------------------+------------------+

2 rows in set (0.02 sec)

mysql> CREATE VIEW department_view(name,function,address)

      -> AS SELECT d_name,function,address FROM department WHERE d_id=1001;用表department創建視圖department_view

mysql> UPDATE department_view SET name='Scientific research',function='New product development',address='5 floor, tower 3'; 更新視圖department_view

mysql> SELECT * FROM department;

+------+-----------------------+-------------------------+------------------+

| d_id | d_name                | function                | address          |

+------+-----------------------+-------------------------+------------------+

| 1001 | Scientific research   | New product development | 5 floor, tower 3 |

| 1002 | ministry of personnel | In charge of production | 1 floor, tower 5 |

+------+-----------------------+-------------------------+------------------+

2 rows in set (0.00 sec)

由上面可以看出,對視圖的更新最后都是實現在基本表上。更新視圖實際上更新的是基本表上的記錄。但是,並不是所有的視圖都可以更新,以下幾情況不能更新視圖:

 視圖中包含 SUM()COUNT()MAX()、和 MIN() 等函數;

 視圖中包含 UNIONUNION ALLDISTINCTGROUP BY HAVIG 等關鍵字;

 常量視圖;

 視圖中的 SELECT中包含子查詢;

 由不可更新的視圖導出的視圖;

 創建視圖時,ALGORITHM TEMPTABLE類型;

 視圖對應的表上存在沒有默認值的列,而且該列沒有包含在視圖里;

 WITH [CASCADED | LOCAL] CHECK OPTION 也將決定視圖能否更新。LOCAL參數表示更新視圖時要滿足該視圖本身的定義條件即可;CASCADED 參數表示更新視圖時要滿足所有相關視圖和表的條件。沒有指明時,默認為CASCADED

 

六、刪除視圖

刪除視圖是指刪除數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據。MySQL中,使用 DROP VIEW 語句來刪除視圖。但是用戶必須擁有 DROP 權限。基本語法如下:

DROP  VIEW  [IF  EXISTS]  視圖名列表  [RESTRICT | CASCADE]

其中,IF EXISTS  參數指判斷視圖存在,如果存在則執行,不存在則不執行;視圖名列表  參數表示要刪除的視圖的名稱列表,各個視圖名稱之間用逗號隔開。

mysql> DROP VIEW IF EXISTS worker_view1,worker_view2; 同時刪除視圖worker_view1worker_view2

mysql> SELECT Drop_priv FROM mysql.user WHERE user='root'; 查看root用戶的 Drop_priv權限

+-----------+

| Drop_priv |

+-----------+

| Y         |

+-----------+

1 row in set (0.00 sec)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM