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

MySQL VIEW(視圖)學習筆記

編輯:MySQL綜合教程

視圖就是存儲下來的SQL SELECT語句,也可以說是虛擬的表(在MySQL中視圖被當著表來用)。這些數據可以是從一個或幾個基本表(或視圖)的數據。也可以是用戶自已定義的數據。其實視圖裡面不存放數據的,數據還是放在基本表裡面,基本表裡面的數據發生變動時,視圖裡面的數據隨之變動

視圖的作用:

■視圖可以讓查詢變得很清楚:

如果您要找的數據存放在三張關系表裡面,查看數據的時候,你就要寫個聯合查詢了。換種方法,我把聯合查詢的數據放到視圖裡面,這樣查詢起來是不是更方便呢?

■保護數據庫的重要數據,給不同的人看不同的數據:

假如您讓別人幫您開發一套系統,但是你又想把真正表的暴露出來,這個時候視圖是不是最好的選擇呢?

視圖的類型:

mysql的視圖有三種類型:MERGE、TEMPTABLE、UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。
1,MERGE,會將引用視圖的語句的文本與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分。
2,TEMPTABLE,視圖的結果將被置於臨時表中,然後使用它執行語句。
3,UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。

二、創建、刪除視圖:

創建視圖基本語法:

 代碼如下 復制代碼 CREATE
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

如下:

 代碼如下 復制代碼

mysql> CREATE VIEW sc AS SELECT s.Name,c.Cname FROM students AS s RIGHT JOIN courses AS c ON s.CID1=c.CID;
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW TABLES;
+------------------+
| Tables_in_jiaowu   |
+------------------+
| courses                |
| sc                        |
| scores                  |
| students              |
| tutors                  |
+------------------+
5 rows in set (0.01 sec)

mysql> SELECT * FROM sc;
+--------------+------------------+
| Name             | Cname                |
+--------------+------------------+
| GuoJing         | TaiJiquan             |
| YangGuo       | TaiJiquan             |
| DingDian       | Qishangquan       |
| HuFei             | Wanliduxing        |
| HuangRong    | Qianzhuwandushou|
| YueLingshang | Wanliduxing        |
| ZhangWuji      | Hamagong          |
| Xuzhu             | TaiJiquan             |
| NULL              | Yiyangzhi            |
| NULL              | Jinshejianfa         |
| NULL              | Qiankundanuoyi |
| NULL              | Pixiejianfa           |
| NULL              | Jiuyinbaiguzhua  |
+--------------+------------------+
13 rows in set (0.02 sec)

刪除視圖基本語法:

 代碼如下 復制代碼 DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

如下:

 代碼如下 復制代碼 mysql> DROP VIEW IF EXISTS sc;
Query OK, 0 rows affected (0.01 sec)

查看視圖創建過程:

 代碼如下 復制代碼

mysql> SHOW CREATE VIEW scG
*************************** 1. row ***************************
                View: sc
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sc` AS select `s`.`Name` AS `Name`,`c`.`Cname` AS `Cname` from (`courses` `c` left join `students` `s` on((`s`.`CID1` = `c`.`CID`)))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)


三、在MySQL中使用視圖的注意事項:

(1) 運行創建視圖的語句需要用戶具有創建視圖(crate view)的權限,若加了[or replace]時,還需要用戶具有刪除視圖(drop view)的權限;
(2) select語句不能包含from子句中的子查詢;
(3) select語句不能引用系統或用戶變量;
(4) select語句不能引用預處理語句參數;
(5) 在存儲子程序內,定義不能引用子程序參數或局部變量;
(6)在定義中引用的表或視圖必須存在。但是,創建了MySQL視圖後,能夠捨棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用check table語句;
(7) 在定義中不能引用temporary表,不能創建temporary視圖;
(8) 在視圖定義中命名的表必須已存在;
(9) 不能將觸發程序與視圖關聯在一起;
(10) 在視圖定義中允許使用order by,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己order by的語句,它將被忽略。
(11)MySQL視圖不支持霧化(即將視圖保持為實際的數據),也不能創建索引,因此效率較低!

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