視圖的概念
視圖是一張虛表,將查詢結果集保存起來,作為視圖使用,實際存在的表叫作基本表,
視圖的作用
- 安全性,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這個欄位,怎么同步到基本表?同步不了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/72679.html
標籤:MySQL
上一篇:MySQL 事務管理
