推薦收藏 —— MySQL視圖詳細(xì)介紹

前言:

在MySQL中陡叠,視圖可能是我們最常用的數(shù)據(jù)庫(kù)對(duì)象之一了顶瞒。那么你知道視圖和表的區(qū)別嗎?你知道創(chuàng)建及使用視圖要注意哪些點(diǎn)嗎绘沉?可能很多人對(duì)視圖只是一知半解煎楣,想詳細(xì)了解視圖的同學(xué)看過(guò)來(lái)喲,本篇文章會(huì)詳細(xì)介紹視圖的概念车伞、創(chuàng)建及使用方法择懂。

1.視圖定義及簡(jiǎn)單介紹

視圖是基于 SQL 語(yǔ)句的結(jié)果集的可視化的表,即視圖是一個(gè)虛擬存在的表另玖,可以包含表的全部或者部分記錄困曙,也可以由一個(gè)表或者多個(gè)表來(lái)創(chuàng)建。使用視圖就可以不用看到數(shù)據(jù)表中的所有數(shù)據(jù)谦去,而是只想得到所需的數(shù)據(jù)慷丽。當(dāng)我們創(chuàng)建一個(gè)視圖的時(shí)候,實(shí)際上是在數(shù)據(jù)庫(kù)里執(zhí)行了SELECT語(yǔ)句鳄哭,SELECT語(yǔ)句包含了字段名稱要糊、函數(shù)、運(yùn)算符妆丘,來(lái)給用戶顯示數(shù)據(jù)锄俄。

視圖的數(shù)據(jù)是依賴原來(lái)表中的數(shù)據(jù)的,所以原來(lái)的表的數(shù)據(jù)發(fā)生了改變勺拣,那么顯示的視圖的數(shù)據(jù)也會(huì)跟著改變奶赠,例如向數(shù)據(jù)表中插入數(shù)據(jù),那么在查看視圖的時(shí)候宣脉,會(huì)發(fā)現(xiàn)視圖中也被插入了同樣的數(shù)據(jù)车柠。視圖實(shí)際上是由預(yù)定義的查詢形式的表所組成的。

2.視圖創(chuàng)建及使用方法

創(chuàng)建視圖標(biāo)準(zhǔn)語(yǔ)法:

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

語(yǔ)法解讀:

1)OR REPLACE:表示替換已有視圖塑猖,如果該視圖不存在竹祷,則CREATE OR REPLACE VIEW與CREATE VIEW相同。

2)ALGORITHM:表示視圖選擇算法羊苟,默認(rèn)算法是UNDEFINED(未定義的):MySQL自動(dòng)選擇要使用的算法 塑陵;merge合并;temptable臨時(shí)表蜡励,一般該參數(shù)不顯式指定令花。

3)DEFINER:指出誰(shuí)是視圖的創(chuàng)建者或定義者,如果不指定該選項(xiàng)凉倚,則創(chuàng)建視圖的用戶就是定義者兼都。

4)SQL SECURITY:SQL安全性,默認(rèn)為DEFINER稽寒。

5)select_statement:表示select語(yǔ)句扮碧,可以從基表或其他視圖中進(jìn)行選擇。

6)WITH CHECK OPTION:表示視圖在更新時(shí)保證約束,默認(rèn)是CASCADED慎王。

其實(shí)我們?nèi)粘?chuàng)建視圖時(shí)蚓土,無(wú)需指定每個(gè)參數(shù),一般情況下赖淤,建議這樣創(chuàng)建視圖:

create view <視圖名稱> [(column_list)]
as select語(yǔ)句
with check option;

下面給出幾個(gè)具體創(chuàng)建示例:

# 單表視圖
mysql> create view v_F_players(編號(hào),名字,性別,電話)
    -> as
    -> select PLAYERNO,NAME,SEX,PHONENO from PLAYERS
    -> where SEX='F'
    -> with check option;
Query OK, 0 rows affected (0.00 sec)

mysql> desc v_F_players;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| 編號(hào)    | int(11)  | NO   |     | NULL    |       |
| 名字    | char(15) | NO   |     | NULL    |       |
| 性別    | char(1)  | NO   |     | NULL    |       |
| 電話    | char(13) | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> select * from  v_F_players;
+--------+-----------+--------+------------+
| 編號(hào)    | 名字      | 性別    | 電話        |
+--------+-----------+--------+------------+
|      8 | Newcastle | F      | 070-458458 |
|     27 | Collins   | F      | 079-234857 |
|     28 | Collins   | F      | 010-659599 |
|    104 | Moorman   | F      | 079-987571 |
|    112 | Bailey    | F      | 010-548745 |
+--------+-----------+--------+------------+
5 rows in set (0.02 sec)

# 多表視圖
mysql> create view v_match
    -> as 
    -> select a.PLAYERNO,a.NAME,MATCHNO,WON,LOST,c.TEAMNO,c.DIVISION
    -> from 
    -> PLAYERS a,MATCHES b,TEAMS c
    -> where a.PLAYERNO=b.PLAYERNO and b.TEAMNO=c.TEAMNO;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from v_match;
+----------+-----------+---------+-----+------+--------+----------+
| PLAYERNO | NAME      | MATCHNO | WON | LOST | TEAMNO | DIVISION |
+----------+-----------+---------+-----+------+--------+----------+
|        6 | Parmenter |       1 |   3 |    1 |      1 | first    |
|       44 | Baker     |       4 |   3 |    2 |      1 | first    |
|       83 | Hope      |       5 |   0 |    3 |      1 | first    |
|      112 | Bailey    |      12 |   1 |    3 |      2 | second   |
|        8 | Newcastle |      13 |   0 |    3 |      2 | second   |
+----------+-----------+---------+-----+------+--------+----------+
5 rows in set (0.04 sec)

視圖在使用時(shí)和基礎(chǔ)表一樣蜀漆,比如我們可以使用 select * from view_name 或 select * from view_name where ... ,視圖可以將我們不需要的數(shù)據(jù)過(guò)濾掉咱旱,將相關(guān)的列名用我們自定義的列名替換确丢。視圖作為一個(gè)訪問(wèn)接口,不管基表的表結(jié)構(gòu)和表名有多復(fù)雜莽龟。一般情況下視圖只用于查詢蠕嫁,視圖本身沒(méi)有數(shù)據(jù),因此對(duì)視圖進(jìn)行的dml操作最終都體現(xiàn)在基表中毯盈,對(duì)視圖進(jìn)行delete剃毒、update、insert操作搂赋,原表同樣會(huì)更新赘阀,drop視圖原表不會(huì)變,視圖不可以truncate脑奠。但是一般情況下我們要避免更新視圖基公,dml操作可以直接對(duì)原表進(jìn)行更新。

3.視圖相關(guān)最佳實(shí)踐

下面簡(jiǎn)單介紹下視圖的優(yōu)點(diǎn)宋欺,通過(guò)這些優(yōu)點(diǎn)我們很容易總結(jié)出視圖的適用場(chǎng)景轰豆。

1)簡(jiǎn)單:使用視圖的用戶完全不需要關(guān)心后面對(duì)應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件齿诞,對(duì)用戶來(lái)說(shuō)已經(jīng)是過(guò)濾好的復(fù)合條件的結(jié)果集酸休。

2)安全:使用視圖的用戶只能訪問(wèn)他們被允許查詢的結(jié)果集,對(duì)表的權(quán)限管理并不能限制到某個(gè)行某個(gè)列祷杈,但是通過(guò)視圖就可以簡(jiǎn)單的實(shí)現(xiàn)斑司。

3)數(shù)據(jù)獨(dú)立:一旦視圖的結(jié)構(gòu)確定了,可以屏蔽表結(jié)構(gòu)變化對(duì)用戶的影響但汞,源表增加列對(duì)視圖沒(méi)有影響宿刮;源表修改列名,則可以通過(guò)修改視圖來(lái)解決私蕾,不會(huì)造成對(duì)訪問(wèn)者的影響僵缺。

總而言之,使用視圖的大部分情況是為了保障數(shù)據(jù)安全性踩叭,提高查詢效率谤饭。比如說(shuō)我們經(jīng)常用到幾個(gè)表的關(guān)聯(lián)結(jié)果,那么我們就可以使用視圖來(lái)處理,或者說(shuō)第三方程序需要調(diào)用我們的業(yè)務(wù)庫(kù)揉抵,可以按需創(chuàng)建視圖給第三方程序查詢。

對(duì)于日常使用及維護(hù)視圖的過(guò)程中嗤疯,個(gè)人總結(jié)出以下幾點(diǎn)實(shí)踐冤今,可供參考:

  • 視圖命名建議統(tǒng)一前綴,比如以v_或view_開(kāi)頭茂缚,便于識(shí)別戏罢。
  • SQL SECURITY使用默認(rèn)的DEFINER,表示已視圖定義者的權(quán)限去查詢視圖脚囊。
  • 視圖定義者建議使用相關(guān)程序用戶龟糕。
  • 視圖不要關(guān)聯(lián)太多的表,造成數(shù)據(jù)冗余悔耘。
  • 查詢視圖時(shí)要附帶條件讲岁,不建議每次都查詢出所有數(shù)據(jù)。
  • 視圖遷移要注意在新環(huán)境有該視圖的定義者用戶衬以。
  • 不要直接更新視圖中的數(shù)據(jù)缓艳,視圖只作查詢。

總結(jié):

視圖在MySQL中經(jīng)常會(huì)用到看峻,本篇文章介紹了視圖的概念以及創(chuàng)建方法阶淘,延伸而來(lái),后續(xù)又講述了視圖的使用場(chǎng)景及優(yōu)點(diǎn)互妓∠希可能在使用時(shí)感覺(jué)不出視圖和表的區(qū)別,其實(shí)這里面的門道還有很多冯勉,在這里建議視圖只作查詢使用澈蚌,按照規(guī)范來(lái),視圖會(huì)帶來(lái)很大的便捷珠闰。希望這篇文章對(duì)你有幫助惜浅。

公眾號(hào).jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伏嗜,隨后出現(xiàn)的幾起案子坛悉,更是在濱河造成了極大的恐慌,老刑警劉巖承绸,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裸影,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡军熏,警方通過(guò)查閱死者的電腦和手機(jī)轩猩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人均践,你說(shuō)我怎么就攤上這事晤锹。” “怎么了彤委?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鞭铆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我焦影,道長(zhǎng)车遂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任斯辰,我火速辦了婚禮舶担,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彬呻。我一直安慰自己衣陶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布废岂。 她就那樣靜靜地躺著祖搓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湖苞。 梳的紋絲不亂的頭發(fā)上拯欧,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音财骨,去河邊找鬼镐作。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隆箩,可吹牛的內(nèi)容都是我干的该贾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捌臊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杨蛋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起理澎,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逞力,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后糠爬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體寇荧,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年执隧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揩抡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户侥。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖峦嗤,靈堂內(nèi)的尸體忽然破棺而出蕊唐,到底是詐尸還是另有隱情,我是刑警寧澤烁设,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布刃泌,位于F島的核電站,受9級(jí)特大地震影響署尤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亚侠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一曹体、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硝烂,春花似錦箕别、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狮杨,卻和暖如春母截,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背橄教。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工清寇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人护蝶。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓华烟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親持灰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盔夜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常堤魁。 O...
    我想起個(gè)好名字閱讀 5,320評(píng)論 0 9
  • 手動(dòng)不易喂链,轉(zhuǎn)發(fā)請(qǐng)注明出處 --Trance 數(shù)據(jù)庫(kù)系統(tǒng)命令: (1).查看存儲(chǔ)過(guò)程狀態(tài):show pro...
    Trance_b54c閱讀 1,664評(píng)論 0 8
  • 50個(gè)常用的sql語(yǔ)句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,232評(píng)論 0 7
  • 1.數(shù)據(jù)庫(kù)簡(jiǎn)介 人類在進(jìn)化的過(guò)程中,創(chuàng)造了數(shù)字姨涡、文字衩藤、符號(hào)等來(lái)進(jìn)行數(shù)據(jù)的記錄,但是承受著認(rèn)知能力和創(chuàng)造能力的提升涛漂,...
    大熊_7d48閱讀 525評(píng)論 0 1
  • ??除非那個(gè)人可以使你比單身時(shí)過(guò)得更好,否則何必為了一個(gè)不值得的人脫離單身? 成功根本沒(méi)有秘訣瓢剿,如果有的話逢慌,就只有...
    夏鴨鴨閱讀 266評(píng)論 0 3