什麼是檢視
資料庫中的檢視是一個虛擬表。檢視是從一個或者多個表中匯出的表,檢視的行為與表非常相似,在檢視中使用者可以使用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、檢視的建立和刪除隻影響檢視本身,不影響對應的基本表