1. 程式人生 > 其它 >MySQL建立檢視(CREATE VIEW)

MySQL建立檢視(CREATE VIEW)

建立檢視是指在已經存在的MySQL資料庫表上建立檢視。檢視可以建立在一張表中,也可以建立在多張表中。

基本語法

可以使用 CREATE VIEW 語句來建立檢視。

語法格式如下:

CREATE VIEW <檢視名> AS <SELECT語句>

語法說明如下。

  • <檢視名>:指定檢視的名稱。該名稱在資料庫中必須是唯一的,不能與其他表或檢視同名
  • <SELECT語句>:指定建立檢視的 SELECT 語句,可用於查詢多個基礎表或源檢視

對於建立檢視中的 SELECT 語句的指定存在以下限制:

  • 使用者除了擁有 CREATE VIEW 許可權外,還具有操作中涉及的基礎表和其他檢視的相關許可權。
  • SELECT 語句不能引用系統或使用者變數
  • SELECT 語句不能包含 FROM 子句中的子查詢
  • SELECT 語句不能引用預處理語句引數

檢視定義中引用的表或檢視必須存在。但是,建立完檢視後,可以刪除定義引用的表或檢視。可使用 CHECK TABLE 語句檢查檢視定義是否存在這類問題。

檢視定義中允許使用 ORDER BY 語句,但是若從特定檢視進行選擇,而該檢視使用了自己的 ORDER BY 語句,則檢視定義中的 ORDER BY 將被忽略。

檢視定義中不能引用 TEMPORARY 表(臨時表),不能建立 TEMPORARY 檢視

WITH CHECK OPTION 的意思是,修改檢視時,檢查插入的資料是否符合 WHERE 設定的條件。

建立基於單表的檢視

MySQL 可以在單個數據表上建立檢視。

檢視 test_db 資料庫中的 tb_students_info 表的資料,如下所示。

mysql> SELECT * FROM tb_students_info;
+----+--------+---------+------+------+--------+------------+
| id | name   | dept_id | age  | sex  | height | login_date |
+----+--------+---------+------+------+--------+------------+
|  1
| Dany | 1 | 25 | F | 160 | 2015-09-10 | | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 | | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 | | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 | | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 | | 6 | John | 2 | 21 | M | 172 | 2015-11-11 | | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 | | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 | | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 | | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 | +----+--------+---------+------+------+--------+------------+ 10 rows in set (0.00 sec)

【例項 1】在 tb_students_info 表上建立一個名為 view_students_info 的檢視,輸入的 SQL 語句和執行結果如下所示。

mysql> CREATE VIEW view_students_info
    -> AS SELECT * FROM tb_students_info;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM view_students_info;
+----+--------+---------+------+------+--------+------------+
| id | name   | dept_id | age  | sex  | height | login_date |
+----+--------+---------+------+------+--------+------------+
|  1 | Dany   |       1 |   25 | F    |    160 | 2015-09-10 |
|  2 | Green  |       3 |   23 | F    |    158 | 2016-10-22 |
|  3 | Henry  |       2 |   23 | M    |    185 | 2015-05-31 |
|  4 | Jane   |       1 |   22 | F    |    162 | 2016-12-20 |
|  5 | Jim    |       1 |   24 | M    |    175 | 2016-01-15 |
|  6 | John   |       2 |   21 | M    |    172 | 2015-11-11 |
|  7 | Lily   |       6 |   22 | F    |    165 | 2016-02-26 |
|  8 | Susan  |       4 |   23 | F    |    170 | 2015-10-01 |
|  9 | Thomas |       3 |   22 | M    |    178 | 2016-06-07 |
| 10 | Tom    |       4 |   23 | M    |    165 | 2016-08-05 |
+----+--------+---------+------+------+--------+------------+
10 rows in set (0.04 sec)

預設情況下,建立的檢視和基本表的欄位是一樣的,也可以通過指定檢視欄位的名稱來建立檢視。

【例項 2】在 tb_students_info 表上建立一個名為 v_students_info 的檢視,輸入的 SQL 語句和執行結果如下所示。

mysql> CREATE VIEW v_students_info
    -> (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    -> AS SELECT id,name,dept_id,age,sex,height,login_date
    -> FROM tb_students_info;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM v_students_info;
+------+--------+------+-------+-------+----------+------------+
| s_id | s_name | d_id | s_age | s_sex | s_height | s_date     |
+------+--------+------+-------+-------+----------+------------+
|    1 | Dany   |    1 |    24 | F     |      160 | 2015-09-10 |
|    2 | Green  |    3 |    23 | F     |      158 | 2016-10-22 |
|    3 | Henry  |    2 |    23 | M     |      185 | 2015-05-31 |
|    4 | Jane   |    1 |    22 | F     |      162 | 2016-12-20 |
|    5 | Jim    |    1 |    24 | M     |      175 | 2016-01-15 |
|    6 | John   |    2 |    21 | M     |      172 | 2015-11-11 |
|    7 | Lily   |    6 |    22 | F     |      165 | 2016-02-26 |
|    8 | Susan  |    4 |    23 | F     |      170 | 2015-10-01 |
|    9 | Thomas |    3 |    22 | M     |      178 | 2016-06-07 |
|   10 | Tom    |    4 |    23 | M     |      165 | 2016-08-05 |
+------+--------+------+-------+-------+----------+------------+
10 rows in set (0.01 sec)

可以看到,view_students_info 和 v_students_info 兩個檢視中的欄位名稱不同,但是資料卻相同。因此,在使用檢視時,可能使用者不需要了解基本表的結構,更接觸不到實際表中的資料,從而保證了資料庫的安全。

建立基於多表的檢視

MySQL 中也可以在兩個以上的表中建立檢視,使用 CREATE VIEW 語句建立

【例項 3】在表 tb_student_info 和表 tb_departments 上建立檢視 v_students_info,輸入的 SQL 語句和執行結果如下所示。

mysql> CREATE VIEW v_students_info
    -> (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    -> AS SELECT id,name,dept_id,age,sex,height,login_date
    -> FROM tb_students_info;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM v_students_info;
+------+--------+------+-------+-------+----------+------------+
| s_id | s_name | d_id | s_age | s_sex | s_height | s_date     |
+------+--------+------+-------+-------+----------+------------+
|    1 | Dany   |    1 |    24 | F     |      160 | 2015-09-10 |
|    2 | Green  |    3 |    23 | F     |      158 | 2016-10-22 |
|    3 | Henry  |    2 |    23 | M     |      185 | 2015-05-31 |
|    4 | Jane   |    1 |    22 | F     |      162 | 2016-12-20 |
|    5 | Jim    |    1 |    24 | M     |      175 | 2016-01-15 |
|    6 | John   |    2 |    21 | M     |      172 | 2015-11-11 |
|    7 | Lily   |    6 |    22 | F     |      165 | 2016-02-26 |
|    8 | Susan  |    4 |    23 | F     |      170 | 2015-10-01 |
|    9 | Thomas |    3 |    22 | M     |      178 | 2016-06-07 |
|   10 | Tom    |    4 |    23 | M     |      165 | 2016-08-05 |
+------+--------+------+-------+-------+----------+------------+
10 rows in set (0.01 sec)

通過這個檢視可以很好地保護基本表中的資料。檢視中包含 s_id、s_name 和 dept_name,s_id 欄位對應 tb_students_info 表中的 id 欄位,s_name 欄位對應 tb_students_info 表中的 name 欄位,dept_name 欄位對應 tb_departments 表中的 dept_name 欄位。

查詢檢視

檢視一經定義之後,就可以如同查詢資料表一樣,使用 SELECT 語句查詢檢視中的資料,語法和查詢基礎表的資料一樣。

檢視用於查詢主要應用在以下幾個方面:

  • 使用檢視重新格式化檢索出的資料。
  • 使用檢視簡化複雜的表連線。
  • 使用檢視過濾資料。

DESCRIBE 可以用來檢視檢視,語法如下:

DESCRIBE 檢視名;

【例項 4】通過 DESCRIBE 語句檢視檢視 v_students_info 的定義,輸入的 SQL 語句和執行結果如下所示。

mysql> DESCRIBE v_students_info;
+----------+---------------+------+-----+------------+-------+
| Field    | Type          | Null | Key | Default    | Extra |
+----------+---------------+------+-----+------------+-------+
| s_id     | int(11)       | NO   |     | 0          |       |
| s_name   | varchar(45)   | YES  |     | NULL       |       |
| d_id     | int(11)       | YES  |     | NULL       |       |
| s_age    | int(11)       | YES  |     | NULL       |       |
| s_sex    | enum('M','F') | YES  |     | NULL       |       |
| s_height | int(11)       | YES  |     | NULL       |       |
| s_date   | date          | YES  |     | 2020-10-22 |       |
+----------+---------------+------+-----+------------+-------+
7 rows in set (0.04 sec)
注意:DESCRIBE 一般情況下可以簡寫成 DESC,輸入這個命令的執行結果和輸入 DESCRIBE 是一樣的。