c_name | stu_name |
wu | 一班 |
li | 二班 |
二、為什么使用視圖
1.安全性。一般是這樣做的:創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù)。之后將用戶權限與視圖綁定。這樣的方式是使用到
了一個特性:grant語句可以針對視圖進行授予權限。
2.查詢性能提高。
3.有靈活性的功能需求后,需要改動表的結構而導致工作量比較大。那么可以使用虛擬表的形式達到少修改的效果。
這是在實際開發(fā)中比較有用的
例子:假如因為某種需要,a表與b表需要進行合并起來組成一個新的表c。最后a表與b表都不會存在了。而由于原來程序中編寫sql分別是基于a表與b表查詢的,這就意味著需要重新編寫大量的sql(改成向c表去操作數(shù)據(jù))。而通過視圖就可以做到不修改。定義兩個視圖名字還是原來的表名a和b。a、b視圖完成從c表中取出內(nèi)容。
說明:使用這樣的解決方式,基于對視圖的細節(jié)了解越詳細越好。因為使用視圖還是與使用表的語法上沒區(qū)別。比如視圖名a,那么查詢還是"select * from a
"。
4.復雜的查詢需求??梢赃M行問題分解,然后將創(chuàng)建多個視圖獲取數(shù)據(jù)。將視圖聯(lián)合起來就能得到需要的結果了。
視圖的工作機制:當調(diào)用視圖的時候,才會執(zhí)行視圖中的sql,進行取數(shù)據(jù)操作。視圖的內(nèi)容沒有存儲,而是在視圖被引用的時候才派生出數(shù)據(jù)。這樣不會占用空間,由于是即時引用,視圖的內(nèi)容總是與真實表的內(nèi)容是一致的。視圖這樣設計有什么好處?節(jié)省空間,內(nèi)容是總是一致的話,那么我們不需要維護視圖的內(nèi)容,維護好真實表的內(nèi)容,就可以保證視圖的完整性了。
三、視圖的執(zhí)行方式
視圖中是沒有保存真實的數(shù)據(jù)的,只是引用了真實表中的數(shù)據(jù),其引用的數(shù)據(jù)有其定義決定,當我們進行查詢視圖其實是從定義中取數(shù)據(jù);
MySQL 中會有infomation_schema 這么一個數(shù)據(jù)庫,它是mysql自帶的一個數(shù)據(jù)庫,存儲mysql數(shù)據(jù)庫的一些元數(shù)據(jù),所謂的元數(shù)據(jù)是指的是mysql的表信息。視圖信息、列信息等。簡單的說就相當于mysql數(shù)據(jù)庫的一個目錄。所有的視圖在views 表中都有存儲說明;從這里我們可以看出mysql 的工作機制;
select * from v_stu;
v_stu也可以是一個表名,由于視圖和表的物理結構不同,表中可以查出真實的數(shù)據(jù),而視圖需要查找到是定義,從而得到需要的數(shù)據(jù),我們怎么知道v_stu是一個視圖呢?是因為有一個查看目錄的例程在做這件事。
視圖機制:
視圖處理有兩種機制,替換式和具化式;
① 替換式:操作視圖時,視圖名直接被視圖定義給替換掉,結果就變成select * from (select c.name as c_name ,s.name as stu_name from student s,class c where c.id = s.class_id),在提交給mysql執(zhí)行;
② 具化式:mysql先得到了視圖執(zhí)行的結果,該結果形成一個中間結果暫時存在內(nèi)存中。之后,外面的select語句就調(diào)用了這些中間結果(臨時表)。
看起來都是要得到結果,形式上有區(qū)別,好像沒體會到本質(zhì)上的區(qū)別。兩種方式又有什么樣的不同呢?
替換方式,將視圖公式替換后,當成一個整體sql進行處理了。具體化方式,先處理視圖結果,后處理外面的查詢需求。
替換方式可以總結為,先準備,后執(zhí)行。
具體化方式總結理解為,分開處理。
哪種方式好?不知道。mysql會自己確定使用哪種方式進行處理的。自己在定義視圖的時候也可以指定使用何種方式。
例子:
語法:
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION];
ALGORITHM有三個參數(shù)分別是:merge、TEMPTABLE、UNDEFINED
merge:處理方式替換式,可以進行更新真實表中的數(shù)據(jù);
TEMPTABLE:具化式,由于數(shù)據(jù)存儲在臨時表中,所以不可以進行更新操作!
當你的參數(shù)定義是UNDEFINED(沒有定義ALGORITHM參數(shù))。mysql更傾向于選擇替換方式。是因為它更加有效。
例子:
create ALGORITHM=merge view v_stu as select c.name as c_name ,s.name as stu_name from student s,class c where c.id = s.class_id update v_stu set c_name = '' where c_name ='';
執(zhí)行成功
create ALGORITHM=TEMPTABLEview v_stu as select c.name as c_name ,s.name as stu_name from student s,class c where c.id = s.class_id
執(zhí)行失敗,不可以更新!
更多關于MySQL相關內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。