視圖就是一張虛表,只存儲表結構,并不存儲表真實數據,數據是在查詢時動態生成的。
使用視圖的好處:
更方便,簡化了操作,我們只需要使用視圖獲取數據,無需知道怎么處理的;
更安全,我們只能訪問到視圖就能得到數據,無需訪問原表;
降低耦合性,表結構更改時,只需要調整下視圖,無需更改應用程序代碼。
1、創建視圖
create view v1 as select * from aa;
create view v1(id,name) as select id,name from aa;
create or replace view v1 as select 語句; #視圖已存在時創建
完整語法:create [algorithm = undefined/merge/temptable] view 視圖名 as 查詢語句 [with [cascaded/local] check option];
通過 algorithm 可以選取相應的算法來從基表展示數據:
(1) merge:把從視圖取數據的 SQL 改變成從原表取數據的 SQL;
(2) temptable:將視圖的結果放置到臨時表中,然后使用它執行語句,此時視圖不可更新;
(3) undefined:MySQL 自動選擇。
2、查看視圖
show tables;
desc v1;
show create view v1\G;
show status like [from db_name] [like tbl_name];
select * from v1;
3、更新視圖
update v1 set name = 'shang' where id = 1;
以下類型的視圖是不能更新的:
(1) 包含聚合函數、distinct、group by、having、union、union all;
(2) 常量視圖;
(3) select 包含子查詢;
(4) 包含連接操作;
(5) from 一個不能更新的視圖;
(6) where 子句的子查詢引用了 from 子句中的表。
4、插入視圖
insert into v1 select value1,value2;
關鍵字 with check option 在插入時進行檢查,滿足視圖條件才允許操作,否則拒絕,比如:
create view v2(name,age) as select name,age from info where age < 20 with check option;
insert into v2 select 'shang',24; #拒絕操作,因為不滿足視圖條件(age < 20)
其他參數:with [local/cascaded] check option
local:只需滿足本視圖條件;
cascaded:默認值,需滿足所有視圖條件(即在視圖派生視圖時,滿足每個視圖條件);
5、修改視圖
alter view v1 ...;
6、刪除視圖
drop [if exists] view v1,v2,...;
總結:
(1) 視圖更多的是提供了一個中間層的功能,來屏蔽一些我們的操作。
(2) MySQL 的視圖功能還是比較弱的,比如說不支持物化視圖等等。