佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > mysql視圖原理與用法實例小結(jié)

mysql視圖原理與用法實例小結(jié)

熱門標(biāo)簽:呼叫中心市場需求 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 百度競價排名 服務(wù)外包 鐵路電話系統(tǒng) Linux服務(wù)器 AI電銷

本文實例總結(jié)了mysql視圖原理與用法。分享給大家供大家參考,具體如下:

一、什么是視圖

視圖是指計算機(jī)數(shù)據(jù)庫中的視圖,是一個虛擬表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。簡單的來說視圖是由其定義結(jié)果組成的表;

例子:定一班級表class(ID,name) 學(xué)生表 student(id,class_id,name);

當(dāng)數(shù)據(jù)表結(jié)構(gòu)很復(fù)雜,但我們只關(guān)心其中一部分?jǐn)?shù)據(jù)的時候就可以使用視圖,定義關(guān)心的數(shù)據(jù)

創(chuàng)建視圖:

復(fù)制代碼 代碼如下:
create 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

查詢視圖 v_stu

select * from v_stu

c_name stu_name
wu 一班
li 二班

二、為什么使用視圖

1.安全性。一般是這樣做的:創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù)。之后將用戶權(quán)限與視圖綁定。這樣的方式是使用到

了一個特性:grant語句可以針對視圖進(jìn)行授予權(quán)限。

2.查詢性能提高。

3.有靈活性的功能需求后,需要改動表的結(jié)構(gòu)而導(dǎo)致工作量比較大。那么可以使用虛擬表的形式達(dá)到少修改的效果。

這是在實際開發(fā)中比較有用的

例子:假如因為某種需要,a表與b表需要進(jìn)行合并起來組成一個新的表c。最后a表與b表都不會存在了。而由于原來程序中編寫sql分別是基于a表與b表查詢的,這就意味著需要重新編寫大量的sql(改成向c表去操作數(shù)據(jù))。而通過視圖就可以做到不修改。定義兩個視圖名字還是原來的表名a和b。a、b視圖完成從c表中取出內(nèi)容。

說明:使用這樣的解決方式,基于對視圖的細(xì)節(jié)了解越詳細(xì)越好。因為使用視圖還是與使用表的語法上沒區(qū)別。比如視圖名a,那么查詢還是"select * from a"。

4.復(fù)雜的查詢需求??梢赃M(jìn)行問題分解,然后將創(chuàng)建多個視圖獲取數(shù)據(jù)。將視圖聯(lián)合起來就能得到需要的結(jié)果了。

視圖的工作機(jī)制:當(dāng)調(diào)用視圖的時候,才會執(zhí)行視圖中的sql,進(jìn)行取數(shù)據(jù)操作。視圖的內(nèi)容沒有存儲,而是在視圖被引用的時候才派生出數(shù)據(jù)。這樣不會占用空間,由于是即時引用,視圖的內(nèi)容總是與真實表的內(nèi)容是一致的。視圖這樣設(shè)計有什么好處?節(jié)省空間,內(nèi)容是總是一致的話,那么我們不需要維護(hù)視圖的內(nèi)容,維護(hù)好真實表的內(nèi)容,就可以保證視圖的完整性了。

三、視圖的執(zhí)行方式

視圖中是沒有保存真實的數(shù)據(jù)的,只是引用了真實表中的數(shù)據(jù),其引用的數(shù)據(jù)有其定義決定,當(dāng)我們進(jìn)行查詢視圖其實是從定義中取數(shù)據(jù);

MySQL 中會有infomation_schema 這么一個數(shù)據(jù)庫,它是mysql自帶的一個數(shù)據(jù)庫,存儲mysql數(shù)據(jù)庫的一些元數(shù)據(jù),所謂的元數(shù)據(jù)是指的是mysql的表信息。視圖信息、列信息等。簡單的說就相當(dāng)于mysql數(shù)據(jù)庫的一個目錄。所有的視圖在views 表中都有存儲說明;從這里我們可以看出mysql 的工作機(jī)制;

select * from v_stu;

v_stu也可以是一個表名,由于視圖和表的物理結(jié)構(gòu)不同,表中可以查出真實的數(shù)據(jù),而視圖需要查找到是定義,從而得到需要的數(shù)據(jù),我們怎么知道v_stu是一個視圖呢?是因為有一個查看目錄的例程在做這件事。

視圖機(jī)制:

視圖處理有兩種機(jī)制,替換式和具化式;

① 替換式:操作視圖時,視圖名直接被視圖定義給替換掉,結(jié)果就變成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í)行的結(jié)果,該結(jié)果形成一個中間結(jié)果暫時存在內(nèi)存中。之后,外面的select語句就調(diào)用了這些中間結(jié)果(臨時表)。

看起來都是要得到結(jié)果,形式上有區(qū)別,好像沒體會到本質(zhì)上的區(qū)別。兩種方式又有什么樣的不同呢?

替換方式,將視圖公式替換后,當(dāng)成一個整體sql進(jìn)行處理了。具體化方式,先處理視圖結(jié)果,后處理外面的查詢需求。

替換方式可以總結(jié)為,先準(zhǔn)備,后執(zhí)行。

具體化方式總結(jié)理解為,分開處理。

哪種方式好?不知道。mysql會自己確定使用哪種方式進(jìn)行處理的。自己在定義視圖的時候也可以指定使用何種方式。

例子:

語法:

CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];

ALGORITHM有三個參數(shù)分別是:merge、TEMPTABLE、UNDEFINED

merge:處理方式替換式,可以進(jìn)行更新真實表中的數(shù)據(jù);

TEMPTABLE:具化式,由于數(shù)據(jù)存儲在臨時表中,所以不可以進(jìn)行更新操作!

當(dāng)你的參數(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í)行失敗,不可以更新!

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

您可能感興趣的文章:
  • MySQL的視圖和索引用法與區(qū)別詳解
  • 淺談MySql 視圖、觸發(fā)器以及存儲過程
  • mysql視圖之創(chuàng)建視圖(CREATE VIEW)和使用限制實例詳解
  • MySQL中Update、select聯(lián)用操作單表、多表,及視圖與臨時表的區(qū)別
  • mysql三張表連接建立視圖
  • MySQL在多表上創(chuàng)建視圖方法
  • MySQL視圖原理與基本操作示例
  • 利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴的問題
  • 詳細(xì)分析mysql視圖的原理及使用方法

標(biāo)簽:銅川 湘潭 黃山 崇左 仙桃 湖南 蘭州 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql視圖原理與用法實例小結(jié)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    桂林市| 行唐县| 凌源市| 金昌市| 原阳县| 宿松县| 房产| 武川县| 延吉市| 波密县| 海林市| 九江市| 开平市| 黔东| 任丘市| 嘉义县| 合江县| 来凤县| 乐山市| 奉化市| 武城县| 桑植县| 阿拉善左旗| 溆浦县| 法库县| 肥西县| 丰城市| 康平县| 瑞丽市| 睢宁县| 武宣县| 磴口县| 新民市| 潢川县| 开鲁县| 常德市| 沾益县| 宕昌县| 教育| 独山县| 晋城|