視圖是一張虛擬的表,並沒有實際存儲數據,存儲的是一種“函數關系”。
語法:
create view 視圖名 as select語句;
為什麼說視圖存儲的是一種函數關系?
當引用視圖時,它會根據這種關系到創建視圖的各個表中去尋找相關字段,並按照這種關系進行運算得到結果。所以視圖不需要存儲數據,只需要存儲這種“函數關系”。
如表1是記錄長方形長的表
長(cm) 10如表2是記錄長方形寬的表
寬(cm) 20現在創建一個視圖用來求長方形面積
面積 長*寬 當需要引用視圖的時候,視圖會按照函數關系“面積=長*寬”到表1和表2中取數據運算得到所需結果。實際上視圖並沒有存儲每個長方形的面積。以上表設計不嚴謹只是為了說明問題。表改變會改變視圖嗎?
因為是函數關系f(x,y),當x或者y有一個變化時,f(x,y)的值一定會變化。x和y相當於創建視圖的表,f(x,y)相當於視圖。
創建一張學生成績表
各個字段分別代表“學生ID”,“數學成績”,“語文成績”,“英語成績”。
現在創建一個求各個學生平均成績的視圖
對表做一下改動,看看視圖會不會跟著一起變化
再看看視圖的內容
視圖的確變化了,所以表的變化一定會影響視圖。
視圖改變會改變表嗎?
這不一定,如果視圖和表是以一個對應的,即f(x,y)可以反得到x,y(類似反函數關系)。這種情況下,視圖改變會影響原有表。
對於求平均成績的視圖,無法由平均成績得到各科的成績,所以他們不是一一對應關系,這種情況Mysql不允許改變視圖。
視圖有三種實現方式
merge:引用視圖時,將引用時的條件與創建視圖時的條件合並。構成新的查詢語句去各個表中查詢。
以之前的平均分視圖為例,紅色劃線為創建視圖的查詢語句
現在要求平均分前三高的學生,可以直接引用視圖來查詢
如果algorithm設置為merge
實際的操作是將這兩次的查詢條件合並相當於
temptable:引用視圖時,先按照創建視圖的條件查詢各個表,將結果生成臨時表,再對臨時表進行查詢。
undefined:數據庫默認undefined,由數據庫根據情況決定用merge還是temptable。
視圖的作用
(1)方便操作:如果要經常用到某個臨時表時,比如上面的平均分視圖。如果沒有定義視圖,每次都需要求平均分臨時表,再去對臨時表進行查詢。有視圖就很方便,直接查詢視圖就可以了。
(2)安全考慮:如果兩個公司合作,需要開放雙方的一些用戶信息,但是又不想公布一些涉及隱私或機密的信息(如用戶密碼),可以生成不包含密碼字段的視圖給對方。對方直接使用視圖即可滿足要求。