淺析Mysql中的視圖
什么是視圖
數(shù)據(jù)庫(kù)中的視圖是一個(gè)虛擬表。視圖是從一個(gè)或者多個(gè)表中導(dǎo)出的表,視圖的行為與表非常相似,在視圖中用戶可以使用SELECT語(yǔ)句查詢數(shù)據(jù),以及使用INSERT、UPDATE和DELETE修改記錄。視圖可以使用戶操作方便,而且可以保障數(shù)據(jù)庫(kù)系統(tǒng)安全。
視圖一經(jīng)定義便存儲(chǔ)在數(shù)據(jù)庫(kù)中,與其相對(duì)應(yīng)的數(shù)據(jù)并沒(méi)有像表那樣在數(shù)據(jù)庫(kù)中再存儲(chǔ)一份,通過(guò)視圖看到的數(shù)據(jù)只是存放在基本表中的數(shù)據(jù)。當(dāng)對(duì)通過(guò)視圖看到的數(shù)據(jù)進(jìn)行修改時(shí),相應(yīng)的基本表中的數(shù)據(jù)也要發(fā)生變化;同時(shí),若基本表的數(shù)據(jù)發(fā)生變化,那么這種變化也自動(dòng)地反映到視圖中。
下面創(chuàng)建兩個(gè)表:
CREATE TABLE teacher
(
teacherId INT,
teacherName VARCHAR(40)
);
CREATE TABLE teacherinfo
(
teacherId INT,
teacherAddr VARCHAR(40),
teacherPhone VARCHAR(20)
);創(chuàng)建視圖
創(chuàng)建視圖使用CREATE VIEW語(yǔ)法,基本語(yǔ)法格式如下:
CREATE[OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCASDED | LOCAL] CHECK OPTION]解釋一下:
1、CREATE表示創(chuàng)建新視圖。REPLACE表示替換已經(jīng)創(chuàng)建的視圖
2、ALGORITHM表示視圖選擇的算法,UNDEFINED表示MySQL自動(dòng)選擇算法,MERGE表示將使用的視圖語(yǔ)句與視圖定義合并起來(lái),TEMPTABLE表示將視圖的結(jié)果存入臨時(shí)表,然后用臨時(shí)表來(lái)執(zhí)行語(yǔ)句
3、view表示視圖的名稱(chēng)
4、column_list為屬性列
5、SELECT_statement表示SELECT語(yǔ)句
6、CASCADED與LOCAL為可選參數(shù),CASCADED為默認(rèn)值,表示更新視圖時(shí)要滿足所有相關(guān)視圖和表的條件;LOCAL則表示更新視圖時(shí)滿足該視圖本身定義即可
該語(yǔ)句要求具有針對(duì)視圖的CREATE VIEW權(quán)限,以及針對(duì)由SELECT語(yǔ)句選擇的每一列上的某些權(quán)限。對(duì)于在SELECT語(yǔ)句中其他地方使用的列,必須具有SELECT權(quán)限,如果還有OR REPLACE子句,必須在仕途上具有DROP權(quán)限。另外,視圖屬于數(shù)據(jù)庫(kù),在默認(rèn)情況下,將在當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建新的視圖,如果想在給定數(shù)據(jù)庫(kù)中明確創(chuàng)建視圖,創(chuàng)建時(shí)應(yīng)將名稱(chēng)指定為db_name.view_name。
1、在單表上創(chuàng)建視圖
比方說(shuō)teacherinfo這張表我只需要teacherId和teacherPhone兩個(gè)字段,那么:
CREATE VIEW view_teacherinfo(view_teacherId, view_teacherPhone) AS SELECT teacherId, teacherPhone from teacherinfo;
因?yàn)槟J(rèn)創(chuàng)建視圖的字段和原表的字段是一樣的,我這里指定視圖的字段名稱(chēng)了。我現(xiàn)在往view_teacherinfo里面插入兩個(gè)字段:
insert into view_teacherinfo values('111', '222');
commit;說(shuō)明視圖中的字段發(fā)生變化,原表中的字段也發(fā)生了變化,證明了前面的結(jié)論,反之也是。
2、在多表上創(chuàng)建視圖
比方說(shuō)我現(xiàn)在需要teacherId、teacherName、teacherPhone三個(gè)字段了,可以這么創(chuàng)建視圖:
CREATE VIEW view_teacherunion(view_teacherId, view_teacherName, view_teacherPhone) AS SELECT teacher.teacherId, teacher.teacherName, teacherinfo.teacherPhone FROM teacher, teacherinfo WHERE teacher.teacherId = teacherinfo.teacherId;
很簡(jiǎn)單,只是把表連一下而已
使用視圖的作用
上面創(chuàng)建了視圖了,看到與直接從數(shù)據(jù)表中讀取相比,視圖有以下優(yōu)點(diǎn):
- 1、簡(jiǎn)單化
看到的就是需要的。視圖不僅可以簡(jiǎn)化用戶對(duì)數(shù)據(jù)的理解,也可以簡(jiǎn)化它們的操作。那些被經(jīng)常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件
- 2、安全性
通過(guò)視圖,用戶只能查詢和修改他們所能看見(jiàn)的數(shù)據(jù),數(shù)據(jù)庫(kù)中的其他數(shù)據(jù)則既看不見(jiàn)也取不到。數(shù)據(jù)庫(kù)授權(quán)命令可以使每個(gè)用戶對(duì)數(shù)據(jù)庫(kù)的檢索限制到特定的數(shù)據(jù)庫(kù)對(duì)象上,但不能授權(quán)到數(shù)據(jù)庫(kù)特定行和特定列上。通過(guò)視圖,用戶可以被限制在數(shù)據(jù)的不同子集上:
(1)使用權(quán)限可被限制在基表的行的子集上
(2)使用權(quán)限可被限制在基表的列的子集上
(3)使用權(quán)限可被限制在基表的行和列的子集上
(4)使用權(quán)限可被限制在多個(gè)基表的連接所限定的行上
(5)使用權(quán)限可被限制在基表的數(shù)據(jù)的統(tǒng)計(jì)匯總上
(6)使用權(quán)限可被限制在另一個(gè)視圖的一個(gè)子集上,或是一些視圖和基表合并后的子集上
- 3、邏輯數(shù)據(jù)獨(dú)立性
視圖可以幫助用戶屏蔽真實(shí)表結(jié)果變化帶來(lái)的影響
查看、修改、刪除視圖
1、DESCRIBE查看視圖基本信息
DESCRIBE語(yǔ)句查看視圖基本信息的語(yǔ)法為:
DESCRIBE 視圖名;
比如:
DESCRIBE view_teacherinfo
結(jié)果顯示出來(lái)視圖的字段定義、字段的數(shù)據(jù)類(lèi)型、是否為空、是否為主/外鍵、默認(rèn)值和額外信息。上面的命令,寫(xiě)成DESC也行
2、SHOW TABLE STATUS查看視圖信息
SHOW TABLE STATUS也可以用來(lái)查看視圖信息,基本語(yǔ)法為:
SHOW TABLE STATUS LIKE '視圖名'
比如:
SHOW TABLE STATUS LIKE 'view_teacherinfo'
后面還有些字段就不列出來(lái)了
3、SHOW CREATE VIEW查看視圖信息
SHOW CREATE VIEW也可以用來(lái)查看視圖信息,基本語(yǔ)法為:
SHOW CREATE VIEW 視圖名;
比如:
SHOW CREATE VIEW view_teacherinfo;
沒(méi)有列完整,不過(guò)可以看到Create View字段把創(chuàng)建視圖的語(yǔ)法給列出來(lái)了
4、修改視圖
修改視圖,就不細(xì)說(shuō)了,因?yàn)?strong>修改視圖的語(yǔ)法和創(chuàng)建視圖的語(yǔ)法是完全一樣的。當(dāng)視圖已經(jīng)存在時(shí),修改語(yǔ)句可以對(duì)視圖進(jìn)行修改;當(dāng)視圖不存在時(shí),創(chuàng)建視圖
5、刪除視圖
當(dāng)視圖不再需要時(shí),可以刪除視圖,刪除一個(gè)或者多個(gè)視圖可以使用DROP VIEW語(yǔ)句,基本語(yǔ)法為:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]其中,view_name是要?jiǎng)h除的視圖名稱(chēng),可以添加多個(gè)需要?jiǎng)h除的視圖名稱(chēng),名稱(chēng)和名稱(chēng)之間使用逗號(hào)分隔開(kāi),刪除視圖必須擁有DROP權(quán)限。比如:
DROP VIEW IF EXISTS view_teacherinfo, view_teacherunion;
看到,這樣就把view_teacherinfo和view_teacherunion兩個(gè)視圖刪除了,因?yàn)榧恿薎F EXISTS,所以即使刪除視圖出錯(cuò)了(比方說(shuō)視圖名字寫(xiě)錯(cuò)了),MySQL也不會(huì)提示錯(cuò)誤,大不了沒(méi)東西刪除罷了
MySQL中視圖和表的區(qū)別
最后總結(jié)一下MySQL中視圖和表的區(qū)別:
1、視圖是已經(jīng)編譯好的SQL語(yǔ)句,是基于SQL語(yǔ)句的結(jié)果集的可視化的表,而表不是
2、視圖沒(méi)有實(shí)際的物理記錄,而基本表有
3、表是內(nèi)容,視圖是窗口
4、表占用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時(shí)對(duì)它進(jìn)行修改,但視圖只能用創(chuàng)建的語(yǔ)句來(lái)修改
5、視圖是查看數(shù)據(jù)表的一種方法,可以查詢數(shù)據(jù)表中的某些字段構(gòu)成的數(shù)據(jù),只是一些SQL語(yǔ)句的集合。從安全的角度講,視圖可以防止用戶接觸數(shù)據(jù)表,因而用戶不知道表結(jié)構(gòu)
6、表屬于全局模式中的表,是實(shí)表;視圖屬于局部模式的表,是虛表
7、視圖的建立和刪除只影響視圖本身,不影響對(duì)應(yīng)的基本表
到此這篇關(guān)于淺析Mysql中的視圖的文章就介紹到這了,更多相關(guān)Mysql視圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何通過(guò)一張圖搞懂springBoot自動(dòng)注入原理
這篇文章主要給大家介紹了關(guān)于如何通過(guò)一張圖搞懂springBoot自動(dòng)注入原理的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解
這篇文章主要為大家介紹了不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
java多線程Synchronized實(shí)現(xiàn)可見(jiàn)性原理解析
這篇文章主要介紹了java多線程Synchronized實(shí)現(xiàn)可見(jiàn)性原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
java整數(shù)與byte數(shù)組的轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了java整數(shù)與byte數(shù)組的轉(zhuǎn)換實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-07-07
編寫(xiě)調(diào)用新浪微博API的Java程序來(lái)發(fā)送微博
這篇文章主要介紹了編寫(xiě)調(diào)用新浪微博API的Java程序來(lái)發(fā)送微博的方法,只是展示了一個(gè)基本的程序框架而非一個(gè)完整的圖形化軟件:)需要的朋友可以參考下2015-11-11
springboot中websocket簡(jiǎn)單實(shí)現(xiàn)
本文主要介紹了springboot中websocket簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

