視圖就是存儲下來的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)