視圖的概念 視圖是一張虛表,將查詢結果集保存起來,作為視圖使用。實際存在的表叫作基本表。 視圖的作用 安全性。grant授權用戶只操作視圖、只讀,可以保護基本表中的數據。 提高查詢性能。視圖只是基本表的一部分,查視圖比查全表快。尤其是多表查詢的時候,查視圖一張表比連接多張表查詢要快。 視圖的常用操作 ...
視圖的概念
視圖是一張虛表,將查詢結果集保存起來,作為視圖使用。實際存在的表叫作基本表。
視圖的作用
- 安全性。grant授權用戶只操作視圖、只讀,可以保護基本表中的數據。
- 提高查詢性能。視圖只是基本表的一部分,查視圖比查全表快。尤其是多表查詢的時候,查視圖一張表比連接多張表查詢要快。
視圖的常用操作
#創建視圖 create view view_computer_dep as (select * from tb_student where dep_id=1); #把電腦系的學生信息保存為視圖
#以後要查詢電腦系的學生信息直接從視圖中查,肯定比從tb_student全表裡查要快。把多表查詢的結果集保存為視圖一張虛表,查詢性能提升更加明顯。
#從視圖中查數據
select * from view_computer_dep;
#修改視圖
create or replace view view_computer_dep as (select id,name from tb_student where dep_id=1); #視圖名要相同。會使用新的結果集替換原來的結果集。
#必須要有create or,不能直接replace,語法不允許。
#如果視圖不存在,會自動創建
#刪除視圖
drop view view_computer_dep;
創建視圖的完整語法
create [algorithm=merge|temptable|undefined] view view_computer_dep as (select * from tb_student where dep_id=1) [with check option] ;
主要註意一下2個可選參數。
algorithm指定視圖的執行機制,有3個可選的值:
(1)merge 合併
合併有2層含義,一是sql語句合併,比如說select * from view_computer_dep 操作視圖,執行時會用視圖定義替換視圖名,實際執行的是select * from (select * from tb_student where dep_id=1);二是操作合併,對視圖中的記錄可以進行增改刪查(實際是對基本表進行增改刪查),所以對視圖中記錄的增改刪會同步到基本表。
此種方式不會創建臨時表,每次都是操作基本表,並不會提高查詢性能。
(2)temptable 臨時表
(select * from tb_student where dep_id=1) as view_computer_dep;
select * from view_computer_dep;
把對基本表的查詢結果保存為臨時表,每次操作的都是臨時表。
此種方式可以提高查詢性能,但只能對視圖進行查詢操作,不能進行增改刪。
(3)undefined 未定義
預設此參數時預設就是undefined,由資料庫決定是使用merge還是使用temptable,mysql是使用merge。
如果使用merge,還可以設置一個可選參數:with check option 是否檢查條件。
創建視圖時設置了條件where dep_id=1(過濾基本表),即視圖中的記錄都是dep_id=1的。
如果設置了with check option,那往視圖中插入記錄時記錄的dep_id必須是1,必須要滿足設置的條件,update更新視圖中的記錄時,dep_id=1這一個欄位也不能改。要保證視圖中的記錄都滿足條件。
不可更新的視圖
就算使用merge,也不是所有視圖中的記錄都可以增刪改的。
create view view_computer_dep as (select * from tb_student where dep_id=1)
as指定視圖的數據來源,如果裡面使用了以下任何一種,創建的視圖都是不可更新的:
- 聚合函數
- group by子句
- having子句
- distinct關鍵字
- union運算符
- from來源於多個表或者來源於不可更新的視圖
一句話,不是直接來源於一個基本表的,對視圖中的記錄都只能進行查詢操作,不能進行增改刪。
比如使用了sum():create view view_computer_dep as (select sum(salary) from tb_employees );
你要update更新視圖中的sum這個欄位,怎麼同步到基本表?同步不了。