標籤:des style blog http io ar color os 使用
目錄:
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");
View Code
(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
6 MySQL視圖