MySQL(十)之視圖
前言
前面給大家介紹了查詢語句,感覺寫的還不錯的,喜歡的可以去查看。今天給大家分享的是MySQL中的視圖。
視圖(View):視圖是由查詢結果形成一張虛擬的表。非臨時表,只要不刪除的話就會一直存放在磁盤上,但是沒有對應的文件。視圖的使用和正常的表的使用一樣。
一、什麽是視圖
視圖是數據庫數據的特定子集。可以禁止所有用戶訪問數據庫表,而要求用戶只能通過視圖操作數據,這種方法可以保護用戶和應用程序不受某些數據庫修改的影響。
視圖是抽象的,他在使用時,從表裏提取出數據,形成虛的表。不過對他的操作有很多的限制。
視圖是永遠不會自己消失的除非手動刪除它。
視圖有時會對提高效率有幫助。臨時表幾乎是不會對性能有幫助,是資源消耗者
視圖一般隨該數據庫存放在一起,臨時表永遠都是在tempdb裏的。
視圖適合於多表連接瀏覽時使用;不適合增、刪、改,這樣可以提高執行效率。
二、視圖概述
2.1、視圖和表的區別
視圖是已經編譯好的sql語句,而表不是。
視圖沒有實際的物理記錄,而表有。
表是內容,視圖是窗口。
表只用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時對它進行修改,但視圖只能有創建的語句來修改。
視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL語句的集合。從安全的角度說,視圖可以不給用戶接觸數據表,從而不知道表結構。
表屬於全局模式中的表,是實表
視圖的建立和刪除只影響視圖本身,不影響對應的基本表。
2.1、視圖和表的聯系
視圖是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有數據行)都來自基本表,它依據基本表存在而存在。
一個視圖可以對應一個基本表,也可以對應多個基本表。
視圖是基本表的抽象和在邏輯意義上建立的新關系。
2.3、視圖的類型
因為不同的數據庫,例如:Mysql、Sql Server、Oracle及DB2等,他們不論在視圖的創建和類型上都有不同,特別是在類型上區別較大,所以這裏我們以Mysql來說明總結,至於其它數據的特點會在日後繼續更新。
create [algorithm=算法] view v_name as select 語句
algorithm = merge/temptable/undifined(前兩種任選)
在Mysql中視圖的類型分為:
1)MERGE
將視圖的sql語句和引用視圖的sql語句合並在一起,最後一起執行。
當引用視圖時,引用視圖的語句與定義視圖的語句合並。
2)TEMPTABLE
將視圖的結果集存放在臨時表中,每次執行時從臨時表中操作。
當引用視圖時,根據視圖的創建語句建立一個臨時表。
3)UNDEFINED
當引用視圖時,根據視圖的創建語句建立一個臨時表。
默認的視圖類型,DBMS傾向於選擇而不是必定選擇MERGE,因為MERGE的效率更高,更重要的是臨時表視圖不能更新。
所以,這裏推薦使用MERGE算法類型視圖。
三、視圖的基本使用
環境:
3.1、創建視圖
create view v_name as select 語句;
創建完一個視圖,可以通過查看數據庫中的全部數據表來查看:
可以看到當前數據庫中已經把剛剛創建的視圖放進數據庫的表集合中了。因為視圖也是一種表,是虛擬表。
3.2、查詢
視圖的查詢和基本表的查詢一樣,因為視圖也是一種數據表,所以你可以像這樣的來查詢它
3.3、刪除視圖
drop view v_name;
刪除視圖,對基本表沒有任何的影響
3.4、修改視圖
alter view v_name as select 語句;
結果檢查:
3.5、更新視圖
1)創建新視圖
2)更新視圖
總結:更新會導致基本表中的數據也會相應的更新
四、使用視圖的優點
4.1、可以簡化查詢
查詢平均工資前三高的部門:
4.2、可以進行權限控制
把表的權限封閉,但是開放相應的視圖查看權限,視圖中只開放部分數據。
4.3、大數據分表時可以用到
比如 一般情況下(無特殊優化)表的行數超過200w時,操作就會明顯變慢,可以把一張表的數據,拆分成多張表來存放。
利用視圖,把多張表形成一張視圖,看起來像是一整張表。
4.4、便於數據庫的維護整理
A、B表合成C表,要想讓原來的SQL不變,可以通過C表,把A、B表結構相同數據相同的視圖創建出來繼續使用。
MySQL(十)之視圖