《Mysql實例mysql視圖的學(xué)習(xí)筆記總結(jié)》要點:
本文介紹了Mysql實例mysql視圖的學(xué)習(xí)筆記總結(jié),希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL教程本節(jié)內(nèi)容:
有關(guān)mysql視圖的學(xué)習(xí)筆記.
MYSQL教程一、為何要使用視圖
MYSQL教程1.平安性.
創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù).之后將用戶權(quán)限與視圖綁定.這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權(quán)限.
2.查詢性能提高.
MYSQL教程3.有靈活性的功能需求后,需要改動表的結(jié)構(gòu)而導(dǎo)致工作量比較大.那么可以使用虛擬表的形式達到少修改的效果.
這是在實際開發(fā)中比較有用的
MYSQL教程例子:假如因為某種需要,a表與b表需要進行合并起來組成一個新的表c.最后a表與b表都不會存在了.而由于原來程序中編寫sql分別是基于a表與b表查詢的,這就意味著需要重新編寫大量的sql(改成向c表去操作數(shù)據(jù)).而通過視圖就可以做到不修改.定義兩個視圖名字還是原來的表名a和b.a、b視圖完成從c表中取出內(nèi)容.
MYSQL教程說明:使用這樣的解決方式,基于對視圖的細節(jié)了解越詳細越好.因為使用視圖還是與使用表的語法上沒區(qū)別.比如視圖名a,那么查詢還是"select * from a".
MYSQL教程4.復(fù)雜的查詢需求.可以進行問題分解,然后將創(chuàng)建多個視圖獲取數(shù)據(jù).將視圖聯(lián)合起來就能得到需要的結(jié)果了.
MYSQL教程視圖的工作機制:當(dāng)調(diào)用視圖的時候,才會執(zhí)行視圖中的sql,進行取數(shù)據(jù)操作.視圖的內(nèi)容沒有存儲,而是在視圖被引用的時候才派生出數(shù)據(jù).這樣不會占用空間,由于是即時引用,視圖的內(nèi)容總是與真實表的內(nèi)容是一致的.
MYSQL教程視圖這樣設(shè)計有什么好處?節(jié)省空間,內(nèi)容是總是一致的話,那么我們不需要維護視圖的內(nèi)容,維護好真實表的內(nèi)容,就可以保證視圖的完整性了.
MYSQL教程二、通過更新視圖實現(xiàn)更新真實表
MYSQL教程看到很多例子,更新視圖可以更新真實表.原因,我是這樣理解的:視圖并沒有保存內(nèi)容.只是引用數(shù)據(jù).那么,更新視圖,其實就是以引用的方式操作了真實表
with check option:對視圖進行更新操作的時,需要檢查更新后的值是否還是滿足視圖公式定義的條件.通俗點,就是所更新的結(jié)果是否還會在視圖中存在.如果更新后的值不在視圖范圍內(nèi),就不允許更新如果創(chuàng)建視圖的時候,沒有加上with check option,更新視圖中的某項數(shù)據(jù)的話,mysql并不會進行有效性檢查.刪掉了就刪掉了.在視圖中將看不到了.
MYSQL教程使用有效性檢查的意義
MYSQL教程視圖的實踐:
重新組織表的需求
?
MYSQL教程針對每個表創(chuàng)建一個視圖,將數(shù)據(jù)保存進去:
?
MYSQL教程報錯:#1050 - Table 'teams' already exists
說明,因為視圖也是一種表,是虛擬表.不能與已有的表(視圖)出現(xiàn)重名
MYSQL教程接下來,刪掉表teams,再執(zhí)行創(chuàng)建視圖的代碼.
MYSQL教程將視圖看成與表一樣的東西,更加容易理解使用規(guī)則.下面這樣對比也許使自己更好理解:
MYSQL教程1.在使用視圖的時候,就是與使用表的語法一樣的.
2.創(chuàng)建視圖的時候,該視圖的名字如果與已經(jīng)存在表重名的話,那么會報錯,不允許創(chuàng)建.視圖就是一種特殊的表
MYSQL教程3.創(chuàng)建視圖的時候,可以這樣使用CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION),可以定義視圖表的結(jié)構(gòu).
4.在phpmyadmin中.左邊的表列表中將視圖與表列在了一起.只有通過右側(cè)的狀態(tài)"View:teams"可以知道該表是視圖表.
MYSQL教程視圖在mysql中的內(nèi)部管理機制:
MYSQL教程視圖的記錄都保存在information_schema數(shù)據(jù)庫中的一個叫views的表中.具體某個視圖的定義代碼以及屬于哪個數(shù)據(jù)庫等信息可以從里面看到理解視圖的兩種工作機制:
MYSQL教程語句:
MYSQL教程針對上面語句,總結(jié)幾個知識點
1.確認是視圖的過程:teams也可以是表名.由于表與視圖的物理機制不同.視圖本身是不存儲內(nèi)容的.所以,在使用sql的時候,mysql是怎么知道teams是一個視圖還是表.是因為有一個查看目錄的例程在做這件事.
MYSQL教程2.mysql對處理視圖的兩種方法:替代方式和具體化方式.
替換方式理解,視圖名直接使用視圖的公式替換掉了.針對上面視圖teams,mysql會使用該視圖的公式進行替換,視圖公式合并到了select中.結(jié)果就是變成了如下sql語句:
?
MYSQL教程也就是最后提交給mysql處理該sql語句.
MYSQL教程具體化方式理解,mysql先得到了視圖執(zhí)行的結(jié)果,該結(jié)果形成一個中間結(jié)果暫時存在內(nèi)存中.之后,外面的select語句就調(diào)
MYSQL教程用了這些中間結(jié)果(臨時表).
MYSQL教程看起來都是要得到結(jié)果,形式上有區(qū)別,好像沒體會到本質(zhì)上的區(qū)別.兩種方式又有什么樣的不同呢?
MYSQL教程替換方式,將視圖公式替換后,當(dāng)成一個整體sql進行處理了.具體化方式,先處理視圖結(jié)果,后處理外面的查詢需求.
替換方式可以總結(jié)為,先準(zhǔn)備,后執(zhí)行.
具體化方式總結(jié)理解為,分開處理.
MYSQL教程哪種方式好?
MYSQL教程mysql會自己確定使用哪種方式進行處理的.自己在定義視圖的時候也可以指定使用何種方式.像這樣
MYSQL教程使用:
?
MYSQL教程ALGORITHM有三個參數(shù)分別是:merge、TEMPTABLE、UNDEFINED
MYSQL教程看mysql手冊中提到,替換與具體化的方式的各自適用之處,可以這樣理解:
因為臨時表中的數(shù)據(jù)不可更新.所以,如果使用參數(shù)是TEMPTABLE,無法進行更新.
當(dāng)參數(shù)定義是UNDEFINED(沒有定義ALGORITHM參數(shù)).mysql更傾向于選擇合并方式.是因為它更加有效罷了.
歡迎參與《Mysql實例mysql視圖的學(xué)習(xí)筆記總結(jié)》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/14336.html