Mysql使用視圖的優點有:保障數據的安全性,提高查詢性能,維護修改方便。現在我們來從0開始學習MySQL視圖(View),後面附帶有實例。
一,什麼視圖
視圖是存放數據的一個接口,也可以說是虛擬的表。這些數據可以是從一個或幾個基本表(或視圖)的數據。也可以是用戶自已定義的數據。其實視圖裡面不存放數據的,數據還是放在基本表裡面,基本表裡面的數據發生變動時,視圖裡面的數據隨之變動。
二,視圖有什麼用
1,視圖可以讓查詢變得很清楚
如果您要找的數據存放在三張關系表裡面,查看數據的時候,你就要寫個聯合查詢了。換種方法,我把聯合查詢的數據放到視圖裡面,這樣查詢起來是不是更方便呢,通phpmyadmin看著是不是更清淅呢。
2,保護數據庫的重要數據,給不同的人看不同的數據
假如您讓別人幫您開發一套系統,但是你又想把真正表的暴露出來,這個時候視圖是不是最好的選擇呢。
三,視圖的類型
mysql的視圖有三種類型:MERGE、TEMPTABLE、UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。
1,MERGE,會將引用視圖的語句的文本與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分。
2,TEMPTABLE,視圖的結果將被置於臨時表中,然後使用它執行語句。
3,UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。
四,添加視圖
1,添加規則
代碼如下
復制代碼
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
2,實例
代碼如下
復制代碼
mysql> use test;
Database changed
mysql> create algorithm = MERGE view aaa as select * from user;//創建一個視圖
Query OK, 0 rows affected (0.00 sec)
上面我們說了,視圖裡面沒有真正的數據,那在數據倉庫裡面,他的存儲是什麼樣子的呢。看下面
代碼如下
復制代碼
[root@BlackGhost test]# cat /usr/local/mysql/data/test/aaa.frm
TYPE=VIEW
query=select `test`.`user`.`id` AS `id`,`test`.`user`.`name` AS `name`,`test`.`user`.`sex` AS `sex` from `test`.`user`
md5=04d5ab2cc3ffcf3376a5e9c946f858ab
updatable=1
algorithm=2
definer_user=
definer_host=
suid=2
with_check_option=0
revision=1
timestamp=2010-10-20 19:59:34
create-version=1
source=select * from user
client_cs_name=utf8
connection_cl_name=utf8_general_ci
view_body_utf8=select `test`.`user`.`id` AS `id`,`test`.`user`.`name` AS `name`,`test`.`user`.`sex` AS `sex` from `test`.`user`
創建的視圖,他沒有.MYD,.MYI這二個文件,一個是存放數據的,一個存放索引的。在這兒就可以說明數據是存在基本表裡面的。
五,修改視圖
1,修改規則
代碼如下
復制代碼
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
2,實例
代碼如下
復制代碼
mysql> alter view aaa as select * from user where id <> any
-> (select u_id from comment);
Query OK, 0 rows affected (0.00 sec)
六,查看,刪除視圖
代碼如下
復制代碼
mysql> select * from aaa; //查看視圖數據
+----+------+-----+
| id | name | sex |
+----+------+-----+
| 3 | tank | 0 |
| 4 | tank | 0 |
+----+------+-----+
2 rows in set (0.00 sec)
mysql> show create view aaaG; //查看視圖
*************************** 1. row ***************************
View: aaa
Create View: CREATE ALGORITHM=MERGE DEFINER=``@`` SQL SECURITY DEFINER VIEW `aaa` AS select `user`.`id` AS `id`,`user`.`name` AS `name`,`user`.`sex` AS `sex` from `user` where `user`.`id` <> any (select `comment`.`u_id` AS `u_id` from `comment`)
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
mysql> drop view aaa; //刪除視圖
Query OK, 0 rows affected (0.00 sec)