視圖
視圖的行和列來自定義視圖的查詢中使用的表,並且是在使用視圖時動態生成的。
![mysql數據庫學習(第十六篇)- 視圖](http://p2.ttnews.xyz/loading.gif)
創建視圖
![mysql數據庫學習(第十六篇)- 視圖](http://p2.ttnews.xyz/loading.gif)
Create view 視圖名字 as ( 單表 or 多表 or 視圖)
Create / Replace [algorithm = {undefined | merge | temptable }] view 視圖名字 [(column_list)] as ( 單表 or 多表 or 視圖) [with [cascaded | local ] check option ]
視圖基表有多張時,注意字段名不能重複!
查看視圖
Show tables ; -- 可以看到視圖
Desc 視圖名稱; -- 可以看到視圖結構(字段)
Show create table 視圖名稱; -- 可以查看到創建視圖語句
Show create view 視圖名稱; -- 可以查看到創建視圖語句
使用視圖
當做表進行查詢就行了
修改視圖
刪除視圖
Drop view 視圖名稱;
Drop table 視圖名稱; -- 不能是table這樣刪除,否則報錯(已測過)
視圖的限制
1、 Mysql的視圖在from 關鍵字後面不能包含子查詢。
解決方案:可以先將子查詢的內容先定義成一個視圖,然後對該視圖再創建視圖就可以實現類似的功能了。
2、 視圖的可更新性和視圖中查詢的定義有關係,有以下類型的視圖是不可更新的
①:包含以下關鍵字的sql語句:聚合函數(sum,min,max,count等等)、distinct、group by、 having、 union 、 或者union all 。
②:常量視圖。
例如:create or replace view view_pi as select 3.1415926 as pi ;
③:select 中包含子查詢
④:join
⑤:from一個不能更新的視圖
⑥:where子句的子查詢引用了from子句中的表。
With [cascaded | local ] check option 決定了是否允許更新數據使記錄不再滿足視圖的條件。
Local:只要滿足本視圖的條件就可以更新;
Cascaded:必須滿足所有針對該視圖的所有視圖的條件才可以更新。
沒有指定的話,默認是cascaded 。
1、 Create or replace view payment_view as select payment_id , amount from payment where amount < 10 with check option ;
2、 Create or replace view payment_view2 as select payment_id , amount from payment_view where amount >5 with local check option ;
3、 Create or replace view payment_view3 as select payment_id , amount from payment_view where amount >5 with cascaded check option ;
修改視圖:
4、 Update payment_view2 set amount = 10 where payment_id = 3; --修改成功
5、 Update payment_view3 set amount = 10 where payment_id = 3; --修改失敗。
Payment_view2 是with local check option 的,所以滿足本視圖的條件就可以更新。
但是payment_view3 是 with cascaded check option 的,必須滿足針對該視圖的所有視圖才可以更新,因為更新後記錄不再滿足payment_view 的條件,所以更新操作提示錯誤退出。
視圖的優勢
簡單: 使用視圖的用戶完全不需要關心後面對應的表的結構,關聯條件和篩選條件,對用戶來說已經是過濾好的複合條件的結果集。
安全: 使用視圖的用戶只能訪問他們被允許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,但是通過視圖就可以簡單的實現。
數據獨立: 一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響。
視圖意義
視圖數據操作
新增數據
刪除數據
1. 多表視圖不能刪除(一般說的多表是連接多張表)
2. 單表視圖可以刪除
更改數據
多表視圖和單表視圖都可以修改數據,
視圖本身只有結構,沒有數據,但是他能夠修改基表的數據。
前提是,他只能修改那些視圖中出現的數據,那些基表存在,而視圖中沒有出現的數據,他根據猜測而想修改的是無效的,不起作用的。因為,他只能修改視圖中出現的數據!!
更新限制
視圖算法
五子句:order by; group by; having ; where ;limit;