目錄:
1. 視圖概述
1.1 為什么引入視圖
1.2 什么是視圖
1.3 視圖的好處
1.4 視圖的分類
2. 視圖的建立和刪除
3. 實驗
?
?
1.? 視圖概述
1.1? 為什么引入視圖 [1]
問題:假如因為某種需要, a 表與 b 表需要進行合并起來組成一個新的表 c 。最后 a 表與 b 表都不會存在了。而由于原來程序中編寫 sql 分別是基于 a 表與 b 表查詢的,這就意味著需要重新編寫大量的 sql( 改成向 c 表去操作數據 ) 。
解決方案:定義兩個視圖名字還是原來的表名 a 和 b 。 a 、 b 視圖完成從 c 表中取出內容。通過視圖就可以做到不修改。
1.2? 什么是視圖 [2]
視圖是從一個或多個表中導出來的表,是一種虛擬存在的表。視圖就像一個窗口,通過這個窗口可以看到系統專門提供的數據。這樣,用戶可以不用看到整個數據庫中的數據,而之關心對自己有用的數據。數據庫中只存放了視圖的定義,而沒有存放視圖中的數據,這些數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。視圖中的數據依賴于原來表中的數據,一旦表中數據發生改變,顯示在視圖中的數據也會發生改變。
1.3? 視圖的好處 [3]
(1)? 安全性。
一般是這樣做的
:
創建一個視圖,定義好該視圖所操作的數據。之后將用戶權限與視圖綁定。這樣的方式是使用到了一個特性:
grant
語句可以針對視圖進行授予權限。
(2)?
查詢性能提高。
(3)?
應對復雜的查詢需求。
可以進行問題分解,然后將創建多個視圖獲取數據。將視圖聯合起來就能得到需要的結果了。
(4)?
靈活應對需求變更。
有靈活性的功能需求后,需要改動表的結構而導致工作量比較大。那么可以使用虛擬表的形式達到少修改的效果。這是在實際開發中比較有用的。比如下文的問題案例。
?
1.4? 視圖的分類 [4]
mysql 的視圖有三種類型: MERGE 、 TEMPTABLE 、 UNDEFINED 。如果沒有 ALGORITHM 子句,默認算法是 UNDEFINED (未定義的)。算法會影響 MySQL 處理視圖的方式。
(1)?MERGE ,會將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應部分。
(2)?TEMPTABLE ,視圖的結果將被置于臨時表中,然后使用它執行語句。
(3)?UNDEFINED , MySQL 將選擇所要使用的算法。如果可能,它傾向于 MERGE 而不是 TEMPTABLE ,這是因為 MERGE 通常更有效,而且如果使用了臨時表,視圖是不可更新的。
?
2.? 視圖的建立和刪除 [5]
mysql 通過 create?view 實現創建視圖,語法:
create?[algorithm={undifined|merge|temptable}]?view?view_name?[(properties)]?as?select?*?[with?[CASCADED|LOCAL]?check?option];
?
解析:
algorithm 是可選參數,表示視圖選擇的算法, undefined 表示 mysql 自動選擇算法, merge 表示將使用視圖的語句與視圖定義合并,使視圖的定義部分取代語句的對應部分, temptable 表示視圖的結構保存到臨時表,然后使用臨時表執行語句。
view_name 表示要創建的視圖的名字。
properties 是可選參數,指定視圖中各屬性的名詞,默認與 select 中查詢的相同。
select 是一個完整的查詢語句從某個表中查詢某些滿足條件的記錄并導入視圖中。
with?check?option 是可選參數,表示更新視圖是要保證在視圖的權限范圍之內。
?
視圖的更改刪除請參看實驗部分。
?
3.? 實驗
(1)? 創建表、插入數據
?

create table book( id int ( 10 ) not null auto_increment, name varchar ( 40 ) not null , author varchar ( 40 ) not null , press varchar ( 40 ) not null , price int ( 4 ), primary key (id) ); insert into book(name,author,press,price) values ("mysql_guider","xiao ming", "whu - press", " 99 "); insert into book(name,author,press,price) values ("python_guider","xiao ming", "whu - press", " 100 "); insert into book(name,author,press,price) values ("ws_guider","xiao ming", "whu - press", " 101 ");
?
(2)? 創建視圖
create?view?book_view?as?select?name,?author?from?book;
?創建成功!
(3)? 查看視圖
desc?book_view;
?
?
(4)? 使用視圖進行查詢
select?*?from?book_view;
?
?
(5)? 使用視圖進行插入數據
insert?into?book_view?values?("lol_guider","xiao?yang");
插入成功!
?
select?*?from?book_view;
?
select?*?from?book;
?
(6)? 使用視圖進行更改數據
update?book_view?set?author="xiao?ma"?where?name="ws_guider";
更改成功!
select?*?from?book;
?
(7)? 更改視圖
alter?view?book_view?as?select?name,?author,?price?from?book?with?cascaded?check?option;
更改成功!
desc?book_view;
?
(8)? 刪除視圖
drop?view?if?exists?book_view;
?
運行成功!
??
參考:
[1]? http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html
[2]? http://www.jb51.net/article/36363.htm
[3]? http://www.cnblogs.com/lyhabc/p/3801527.html
[4]? http://blog.51yip.com/mysql/1062.html
[5]? http://www.cnblogs.com/kiwi/archive/2012/11/17/2775228.html
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
