一、定義
視圖,view 是一種有結構(有行有列),但沒有結果(結構中不真實存放數據)的虛擬表,虛擬表結構的來源不是自己定義,而是從對應的基表中產生(視圖的數據來源)
1.1 創建視圖
1.1.1 基本語法
create view 視圖名 as select 語句;
-- select 語句可以是:普通查詢,連接查詢,聯合查詢,子查詢
1.1.2創建
- 創建單表視圖 :基表只有一個
CREATE VIEW my_view1 as select * from `c_student`
CREATE VIEW my_view2 as select * from `c_class`
- 創建多表視圖 :基表有多個
CREATE VIEW my_view3 as select s.*,c.c_name,c.room from c_student as s left join c_class as c on s.c_id = c.id;
1.1.2查看視圖
是指查看視圖的結構,視圖是一張虛擬表。表的所有查看語句都適用于視圖
show tables [like]
desc 視圖名
show create table 視圖名
show create view 視圖名
二、視圖的使用
視圖的使用主要是為了查詢
- 視圖的查詢
select * from my_view1;
select * from my_view2;
select * from my_view3;
- 視圖的修改
視圖本身不可以修改,但視圖的來源可以修改
修改視圖:修改視圖本身的來源語句(select語句)
語法
alter view 視圖名字 as 新的 select 語句
示例
alter VIEW my_view1 as select id,name,sex,height,age,c_id from `c_student`
- 刪除視圖
drop view 視圖名
- 視圖的意義
- 視圖可以節省SQL語句,將一條復雜的select 語句使用視圖進行保存,以后可以直接對視圖進行操作
2.數據安全:視圖的操作是主要針對查詢的,如果對視圖進行結構處理
(刪除),不會影響基表數據
3.視圖往往是在大項目中使用,而且是多系統,可以為了安全影藏關鍵數據
4.視圖可以對外提供友好型數據,不同的視圖提供不同的數據,對外好像是專門設計,
5.視圖可以更好的進行權限控制
- 視圖的操作
視圖的確可以進行寫操作,但是有很多限制
將數據直接在視圖上進行操作
(1)新增
數據新增是直接對視圖進行數據新增
條件:
1.多表視圖不能新增數據
2.可以向單表視圖插入數據,但是要包括所有不為空的字段
INSERT INTO my_view4 values (11,'阿飛','男',174,24,3)
上面的語句沒有包括學生表中的number字段,但number字段默認不為空,插入失敗
3.視圖是可以向基表插入數據的
(2)刪除
多表視圖不能刪除
單表視圖可以刪除
DELETE FROM my_view2 where id = 10
刪除單表視圖,對應的數據表也將刪除
(3)
多表和單表視圖都可以更新
UPDATE my_view3 set c_id = 1 WHERE id = 8
但如果創建視圖是帶有with option 條件,對應條件里的數據不能修改
CREATE VIEW my_view5 as select * from `c_student` where age <20 with CHECK OPTION
-- where age <20 年齡小于20歲
-- with CHECK OPTION 屬于該條件的age字段更新操作不能超過20
UPDATE my_view5 set age = 20 where id = 1
UPDATE my_view5 set age = 19 where id = 1
視圖算法
視圖算法:系統對視圖以及外部查詢視圖的select語句的一種解析方式。分為三類:
(1)undefined 未定義(默認),但不是一種實際的算法
(2)template 臨時表算法:系統應該先執行視圖的select 語句后執行外部查詢語句
(3)merge 合并算法:系統應該先將視圖對應的select語句與外部select語句進行合并,然后執行(效率高:系統經常選擇該算法)。
算法指定:
在創建視圖的時候指定
需求:找到每個班里身高最高的學生
示例1:
創建一個視圖,使用默認算法
create VIEW my_view6 AS
select * from `c_student` ORDER BY `height` desc;
結果:不符合要求
示例2:使用template 臨時表算法:
create ALGORITHM=TEMPTABLE view my_view8 as
select * from `c_student` ORDER BY `height` desc;
復合條件