溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

十、MySQL視圖

發(fā)布時(shí)間:2020-06-19 18:36:49 來源:網(wǎng)絡(luò) 閱讀:389 作者:少年不在了 欄目:MySQL數(shù)據(jù)庫

 數(shù)據(jù)庫中的視圖是一個(gè)虛擬表。同真實(shí)的表一樣,視圖包含一系列帶有名稱的行和列數(shù)據(jù)。行和列數(shù)據(jù)來自由定義視圖查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。

10.1、視圖概述

 視圖是從一個(gè)或多個(gè)表中導(dǎo)出的,視圖的行為與表非常相似,但視圖是一個(gè)虛擬表。在視圖中用戶可以使用SELECT語句查詢,以及使用INSERT、UPDATE、DELETE修改記錄。

 視圖是一個(gè)虛擬表,是從數(shù)據(jù)庫中一個(gè)或多個(gè)表中導(dǎo)出來的表。試圖還可以從已存在的視圖的基礎(chǔ)上定義。視圖一經(jīng)定義便存儲(chǔ)在數(shù)據(jù)庫中,與其相對應(yīng)的數(shù)據(jù)并沒有像表那樣在數(shù)據(jù)庫中再存儲(chǔ)一份。通過視圖看到的數(shù)據(jù)只是存在基本表的數(shù)據(jù)。

  視圖的主要優(yōu)點(diǎn)有:

1. 視點(diǎn)集中

視圖集中即是使用戶只關(guān)心它感興趣的某些特定數(shù)據(jù)和他們所負(fù)責(zé)的特定任務(wù)。這樣通過只允許用戶看到視圖中所定義的數(shù)據(jù)而不是視圖引用表中的數(shù)據(jù)而提高了數(shù)據(jù)的安全性。

2. 簡化操作

視圖大大簡化了用戶對數(shù)據(jù)的操作。因?yàn)樵诙x視圖時(shí),若視圖本身就是一個(gè)復(fù)雜查詢的結(jié)果集,這樣在每一次執(zhí)行相同的查詢時(shí),不必重新寫這些復(fù)雜的查詢語句,只要一條簡單的查詢視圖語句即可。可見視圖向用戶隱藏了表與表之間的復(fù)雜的連接操作。

3. 定制數(shù)據(jù)

視圖能夠?qū)崿F(xiàn)讓不同的用戶以不同的方式看到不同或相同的數(shù)據(jù)集。因此,當(dāng)有許多不同水平的用戶共用同一數(shù)據(jù)庫時(shí),這顯得極為重要。

4. 合并分割數(shù)據(jù)

在有些情況下,由于表中數(shù)據(jù)量太大,故在表的設(shè)計(jì)時(shí)常將表進(jìn)行水平分割或垂直分割,但表的結(jié)構(gòu)的變化卻對應(yīng)用程序產(chǎn)生不良的影響。如果使用視圖就可以重新保持原有的結(jié)構(gòu)關(guān)系,從而使外模式保持不變,原有的應(yīng)用程序仍可以通過視圖來重載數(shù)據(jù)。

5. 安全性

視圖可以作為一種安全機(jī)制。通過視圖用戶只能查看和修改他們所能看到的數(shù)據(jù)。其它數(shù)據(jù)庫或表既不可見也不可以訪問。如果某一用戶想要訪問視圖的結(jié)果集,必須授予其訪問權(quán)限。視圖所引用表的訪問權(quán)限與視圖權(quán)限的設(shè)置互不影響。


10.2、創(chuàng)建視圖

創(chuàng)建視圖的語法

 創(chuàng)建視圖使用CREATE VIEW語句,其語法格式為:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

CREATE表示創(chuàng)建新的視圖

REPLACE表示替換已創(chuàng)建的視圖

ALGORITHM表示視圖選擇的算法

  UNDEFINED:MySQL自動(dòng)選擇算法

  MERGE:將使用的視圖語句與視圖定義結(jié)合起來,使得視圖定義的某一部分取代語句對應(yīng)的部分 

  TEMPTABLE:將視圖的結(jié)果存入臨時(shí)表,然后用臨時(shí)表來執(zhí)行語句

view_name為視圖的名稱,column_list為屬性列
select_statement表示SELECT語句

WITH [CASCADED | LOCAL] CHECK OPTION參數(shù)表示視圖在更新時(shí)保證在視圖的權(quán)限范圍內(nèi)

  CASCADED:表示更新視圖時(shí)要滿足所有相關(guān)視圖和表的條件

  LOCAL:更新視圖時(shí)滿足該視圖本身定義的條件即可 


在單表上創(chuàng)建視圖


在t表格上創(chuàng)建一個(gè)名為view_t的視圖

mysql> CREATE TABLE t (qty INT, price INT);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO t VALUES(3, 50);
Query OK, 1 row affected (0.02 sec)

mysql> CREATE VIEW view_t AS SELECT qty, price, qty *price FROM t;            
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM view_t;
+------+-------+------------+
| qty  | price | qty *price |
+------+-------+------------+
|    3 |    50 |        150 |
+------+-------+------------+
1 row in set (0.00 sec)


在t表格上創(chuàng)建一個(gè)名為view_t2的視圖

mysql> CREATE VIEW view_t2(qty, price, total ) AS SELECT qty, price, qty *price FROM t;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+
1 row in set (0.00 sec)


在多表上創(chuàng)建視圖


在表student和表stu_info上創(chuàng)建視圖stu_glass

mysql> CREATE TABLE student( id INT, name CHAR(11));  
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE stu_info(
    -> id INT,
    -> name CHAR(11),
    -> glass CHAR(11)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO student VALUES(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai'); 
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO stu_info VALUES(1, 'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','sh
andong');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> CREATE VIEW stu_glass (id,name, glass) AS SELECT student.id,student.name ,stu_info.
glass FROM student ,stu_info WHERE student.id=stu_info.id;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM stu_glass;
+------+----------+----------+
| id   | name     | glass    |
+------+----------+----------+
|    1 | wanglin1 | henan    |
|    2 | gaoli    | hebei    |
|    3 | zhanghai | shandong |
+------+----------+----------+
3 rows in set (0.00 sec)


10.3、查看視圖

  查看視圖是查看數(shù)據(jù)庫中已存在的視圖的定義。查看視圖必須有SHOW VIEW 的權(quán)限。查看視圖的方法有DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW。

通過DESCRIBE語句查看視圖view_t的定義

mysql> DESCRIBE view_t;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| qty        | int(11)    | YES  |     | NULL    |       |
| price      | int(11)    | YES  |     | NULL    |       |
| qty *price | bigint(21) | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


使用SHOW TABLE STATUS命令查看視圖信息

mysql> SHOW TABLE STATUS LIKE 'view_t' \G;
*************************** 1. row ***************************
           Name: view_t
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)
ERROR: 
No query specified

mysql> SHOW TABLE STATUS LIKE 't' \G;
*************************** 1. row ***************************
           Name: t
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 1
 Avg_row_length: 16384
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 7340032
 Auto_increment: NULL
    Create_time: 2017-08-04 19:38:50
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)
ERROR: 
No query specified


SHOW CREATE VIEW查看視圖的詳細(xì)定義,代碼如下:

mysql> SHOW CREATE VIEW view_t \G;
*************************** 1. row ***************************
                View: view_t
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`qty` AS `qty`,`t`.`price` AS `price`,(`t`.`qty` * `t`.`price`) AS `qty *price` from `t`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified


在views表中查看視圖的詳細(xì)定義

mysql> SELECT * FROM information_schema.views \G;
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: stu_glass
     VIEW_DEFINITION: select `test`.`student`.`id` AS `id`,`test`.`student`.`name` AS `name`,`test`.`stu_info`.`glass` AS `glass` from `test`.`student` join `test`.`stu_info` where (`test`.`student`.`id` = `test`.`stu_info`.`id`)
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
*************************** 2. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: view_t
     VIEW_DEFINITION: select `test`.`t`.`qty` AS `qty`,`test`.`t`.`price` AS `price`,(`test`.`t`.`qty` * `test`.`t`.`price`) AS `qty *price` from `test`.`t`
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
*************************** 3. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: view_t2
     VIEW_DEFINITION: select `test`.`t`.`qty` AS `qty`,`test`.`t`.`price` AS `price`,(`test`.`t`.`qty` * `test`.`t`.`price`) AS `total` from `test`.`t`
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
3 rows in set (0.00 sec)
ERROR: 
No query specified


10.4、修改視圖

 修改視圖是指修改數(shù)據(jù)庫中存在的視圖,當(dāng)基本表的某些字段發(fā)生變化的時(shí)候,可以通過修改視圖來保持與基本表的一致性。MySQL通過CREATE OR REPLACE VIEW語句和ALTER語句修改視圖。

  使用CREATE OR REPLACE VIEW的基本語法為:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

修改視圖view_t

mysql> DESC view_t;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| qty        | int(11)    | YES  |     | NULL    |       |
| price      | int(11)    | YES  |     | NULL    |       |
| qty *price | bigint(21) | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> CREATE OR REPLACE VIEW view_t AS SELECT * FROM t;
Query OK, 0 rows affected (0.07 sec)

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
| price | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)


 ALTER語句是MySQL提供的另一種修改視圖的方法,其語法格式為:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

使用ALTER語句修改視圖view_t

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
| price | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> ALTER VIEW view_t AS SELECT qty FROM t;      
Query OK, 0 rows affected (0.01 sec)

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)


10.5、更新視圖

 更新視圖是指通過視圖來插入、更新、刪除表中的數(shù)據(jù),因?yàn)橐晥D是一個(gè)虛擬表,其中沒有數(shù)據(jù)。通過視圖更新的時(shí)候都是轉(zhuǎn)到基本表上進(jìn)行更新的。

使用UPDATE語句更新視圖view_t

mysql> SELECT * FROM view_t;   /*查看更新之前的視圖*/
+------+
| qty  |
+------+
|    3 |
+------+
1 row in set (0.00 sec)        

mysql> SELECT * FROM t;       /*查看更新之前的表*/
+------+-------+
| qty  | price |
+------+-------+
|    3 |    50 |
+------+-------+
1 row in set (0.00 sec)
               
mysql> UPDATE view_t SET qty=5;  /*更新視圖*/   
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM t;          /*查看更新之后的表*/
+------+-------+
| qty  | price |
+------+-------+
|    5 |    50 |
+------+-------+
1 row in set (0.00 sec)

mysql> SELECT * FROM view_t;    /*查看更新之后的視圖*/
+------+
| qty  |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM view_t2; 
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
+------+-------+-------+
1 row in set (0.00 sec)


使用INSERT語句在基本表t中插入一條記錄

mysql> INSERT INTO t VALUES (3,5);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM t;
+------+-------+
| qty  | price |
+------+-------+
|    5 |    50 |
|    3 |     5 |
+------+-------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
|    3 |     5 |    15 |
+------+-------+-------+
2 rows in set (0.00 sec)


  當(dāng)視圖中包含以下內(nèi)容時(shí),視圖的更新操作將不能執(zhí)行:

視圖中不包含基表中被定義為非空的列;

在定義視圖的SELECT語句后的字段列表中使用了數(shù)學(xué)表達(dá)式;

在定義視圖的SELECT語句后的字段列表中使用聚合函數(shù);

在定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING子句。

10.6、刪除視圖

 當(dāng)視圖不再需要時(shí),可以將其刪除,其語法格式為:

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

刪除stu_glass視圖

mysql> DROP VIEW IF EXISTS stu_glass;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE VIEW stu_glass;
ERROR 1146 (42S02): Table 'test.stu_glass' doesn't exist




向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI