什麼是視圖
數據庫中的視圖是一個虛擬表。視圖是從一個或者多個表中導出的表,視圖的行為與表非常相似,在視圖中用戶可以使用SELECT語句查詢數據,以及使用INSERT、UPDATE和DELETE修改記錄。視圖可以使用戶操作方便,而且可以保障數據庫系統安全。
視圖一經定義便存儲在數據庫中,預期相對應的數據並沒有像表那樣在數據庫中再存儲 一份,通過視圖看到的數據只是存放在基本表中的數據。當對通過視圖看到的數據進行修改時,相應的基本表中的數據也要發生變化;同時,若基本表的數據發生變 化,那麼這種變化也自動地反映到視圖中。
下面創建兩個表:
CREATE TABLE teacher ( teacherId INT, teacherName VARCHAR(40) ); CREATE TABLE teacherinfo ( teacherId INT, teacherAddr VARCHAR(40), teacherPhone VARCHAR(20) );
創建視圖
創建視圖使用CREATE VIEW語法,基本語法格式如下:
CREATE[OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_statement [WITH [CASCASDED | LOCAL] CHECK OPTION]
解釋一下:
1、CREATE表示創建新視圖。REPLACE表示替換已經創建的視圖
2、ALGORITHM表示視圖選擇的算法,UNDEFINED表示MySQL自動選擇算法,MERGE表示將使用的視圖語句與視圖定義合並起來,TEMPTABLE表示將視圖的結果存入臨時表,然後用臨時表來執行語句
3、view表示視圖的名稱
4、column_list為屬性列
5、SELECT_statement表示SELECT語句
6、CASCADED與LOCAL為可選參數,CASCADED為默認值,表示更新視圖時要滿足所有相關視圖和表的條件;LOCAL則表示更新視圖時滿足該視圖本身定義即可
該語句要求具有針對視圖的CREATE VIEW權限,以及針對由SELECT語句選擇的每一列上的某些權限。對於在SELECT語句中其他地方使用的列,必須具有SELECT權限,如果還有 OR REPLACE子句,必須在仕途上具有DROP權限。另外,視圖屬於數據庫,在默認情況下,將在當前數據庫創建新的視圖,如果想在給定數據庫中明確創建視 圖,創建時應將名稱指定為db_name.view_name。
1、在單表上創建視圖
比方說teacherinfo這張表我只需要teacherId和teacherPhone兩個字段,那麼:
CREATE VIEW view_teacherinfo(view_teacherId, view_teacherPhone) AS SELECT teacherId, teacherPhone from teacherinfo;
因為默認創建視圖的字段和原表的字段是一樣的,我這裡指定視圖的字段名稱了。我現在往view_teacherinfo裡面插入兩個字段:
insert into view_teacherinfo values('111', '222'); commit;
看一下視圖view_teacherinfo和原表teacherinfo:
說明視圖中的字段發生變化,原表中的字段也發生了變化,證明了前面的結論,反之也是。
2、在多表上創建視圖
比方說我現在需要teacherId、teacherName、teacherPhone三個字段了,可以這麼創建視圖:
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;
很簡單,只是把表連一下而已
使用視圖的作用
上面創建了視圖了,看到與直接從數據表中讀取相比,視圖有以下優點:
1、簡單化
看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化它們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以後的操作每次指定全部的條件
2、安全性
通過視圖,用戶只能查詢和修改他們所能看見的數據,數據庫中的其他數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定列上。通過視圖,用戶可以被限制在數據的不同子集上:
(1)使用權限可被限制在基表的行的子集上
(2)使用權限可被限制在基表的列的子集上
(3)使用權限可被限制在基表的行和列的子集上
(4)使用權限可被限制在多個基表的連接所限定的行上
(5)使用權限可被限制在基表的數據的統計匯總上
(6)使用權限可被限制在另一個視圖的一個子集上,或是一些視圖和基表合並後的子集上
3、邏輯數據獨立性
視圖可以幫助用戶屏蔽真實表結果變化帶來的影響
查看、修改、刪除視圖
1、DESCRIBE查看視圖基本信息
DESCRIBE語句查看視圖基本信息的語法為:
DESCRIBE 視圖名;
比如:
DESCRIBE view_teacherinfo
結果為:
結果顯示出來視圖的字段定義、字段的數據類型、是否為空、是否為主/外鍵、默認值和額外信息。上面的命令,寫成DESC也行
2、SHOW TABLE STATUS查看視圖信息
SHOW TABLE STATUS也可以用來查看視圖信息,基本語法為:
SHOW TABLE STATUS LIKE '視圖名'
比如:
SHOW TABLE STATUS LIKE 'view_teacherinfo'
結果為:
後面還有些字段就不列出來了
3、SHOW CREATE VIEW查看視圖信息
SHOW CREATE VIEW也可以用來查看視圖信息,基本語法為:
SHOW CREATE VIEW 視圖名;
比如:
SHOW CREATE VIEW view_teacherinfo;
運行結果為:
沒有列完整,不過可以看到Create View字段把創建視圖的語法給列出來了
4、修改視圖
修改視圖,就不細說了,因為修改視圖的語法和創建視圖的語法是完全一樣的。當視圖已經存在時,修改語句可以對視圖進行修改;當視圖不存在時,創建視圖
5、刪除視圖
當視圖不再需要時,可以刪除視圖,刪除一個或者多個視圖可以使用DROP VIEW語句,基本語法為:
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
其中,view_name是要刪除的視圖名稱,可以添加多個需要刪除的視圖名稱,名稱和名稱之間使用逗號分隔開,刪除視圖必須擁有DROP權限。比如:
DROP VIEW IF EXISTS view_teacherinfo, view_teacherunion;
看到,這樣就把view_teacherinfo和view_teacherunion兩個視圖刪除了,因為加了IF EXISTS,所以即使刪除視圖出錯了(比方說視圖名字寫錯了),MySQL也不會提示錯誤,大不了沒東西刪除罷了
MySQL中視圖和表的區別
最後總結一下MySQL中視圖和表的區別:
1、視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化的表,而表不是
2、視圖沒有實際的物理記錄,而基本表有
3、表是內容,視圖是窗口
4、表占用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時對它進行修改,但視圖只能用創建的語句來修改
5、視圖是查看數據表的一種方法,可以查詢數據表中的某些字段構成的數據,只是一些SQL語句的集合。從安全的角度講,視圖可以防止用戶接觸數據表,因而用戶不知道表結構
6、表屬於全局模式中的表,是實表;視圖屬於局部模式的表,是虛表
7、視圖的建立和刪除只影響視圖本身,不影響對應的基本表