mysql學習五:檢視下
檢視資料操作
檢視資料操作:雖然我們說檢視可以稱之為select
語句的別名,但實際上,它和別名並不一樣,因為檢視是可以進行資料寫操作的,只不過有很多限制而已。
新增資料
在這裡,新增資料就是指通過檢視直接對基表進行資料的新增操作。
- 限制 1:多表檢視不能進行新增資料。
執行如下 SQL 語句,進行測試:
-- 查詢檢視 my_v3 結構
desc my_v3;
-- 多表檢視新增資料
insert into my_v3 values(7,'Gates','boy',2,170,'PM3.5','A315');
- 1
- 2
- 3
- 4
- 5
- 限制 2:可以向單表檢視新增資料,但檢視中包含的欄位必須有基表中所有不能為空的欄位。
執行如下 SQL 語句,進行測試:
-- 查詢 student 表結構
desc student;
-- 建立檢視 my_v4
create view my_v4 as
select id,name,age,c_id from student;
-- 單表檢視新增資料
insert into my_v4 values(7,'Gates',25,2);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如上圖所示,在我們新建的檢視my_v4
中,沒有包含不能為空的欄位gender
,因此在我們向my_v4
中新增資料的時候,報錯。其實,這也很好理解,試想,在
MySQL 嘗試將檢視中新增的資料(一條記錄)插入到基表的時候,忽然發現一個本不能為null
null
,自然就會報錯啦!反之,如果單表檢視中包含了基表中的全部非空欄位,自然可以插入成功。執行如下
SQL 語句,進行測試:
-- 查詢 class 表資料
select * from class;
-- 建立檢視 my_v5
create view my_v5 as
select * from class;
-- 單表檢視新增資料
insert into my_v5 values(2,'PM2016','A315');
-- 查詢 class 表資料
select * from class;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
如上圖所示,顯然我們通過單表檢視向基表中插入資料成功啦!
刪除資料
與新增資料類似,
- 多表檢視不能刪除資料;
- 單表檢視可以刪除資料。
執行如下 SQL 語句,進行測試:
-- 查詢多表檢視 my_v3
select * from my_v3;
-- 刪除多表檢視 my_v3 中記錄
delete from my_v3 where id = 2;
-- 查詢單表檢視 my_v5
select * from my_v5;
-- 刪除單表檢視 my_v5 中記錄
delete from my_v5 where id = 2;
-- 查詢單表檢視 my_v5
select * from my_v5;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
更新資料
理論上,無論多表檢視還是單表檢視,都可以進行資料的更新。
執行如下 SQL 語句,進行測試:
-- 查詢單表檢視 my_v5
select * from my_v5;
-- 更新單表檢視 my_v5
update my_v5 set grade = 'PM2014' where id = 5;
-- 查詢單表檢視 my_v5
select * from my_v5;-- 查詢單表檢視 my_v5
select * from my_v5;
-- 更新單表檢視 my_v5
update my_v5 set grade = 'PM2014' where id = 5;
-- 查詢單表檢視 my_v5
select * from my_v5;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
此外,更新檢視資料並不總是成功的,這是因為有更新限制的存在。那麼何為更新限制呢?
- 更新限制:
with check option
,如果建立檢視的時候,設定了某個欄位的限制,那麼對檢視進行更新操作的時候,系統就會進行驗證,要保證更新之後,資料依然可以被查出來,否則不讓更新。
執行如下 SQL 語句,進行測試:
-- 建立單表檢視 my_v6
create view my_v6 as
select * from student where height > 170 with check option;
-- 查詢單表檢視 my_v6
select * from my_v6;
-- 更新單表檢視 my_v6
update my_v6 set height = 165 where id = 6;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如上圖所示,在更新檢視的時候,更新失敗,這是因為其違反了我們設定的更新限制。那麼,檢視之外的資料,我們能不能修改呢?執行如下 SQL 語句,進行測試:
-- 查詢單表檢視 my_v6
select * from my_v6;
-- 更新單表檢視 my_v6
update my_v6 set height = 188 where id = 4;
-- 查詢單表檢視 my_v6
select * from my_v6;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
如上圖所示,更新檢視my_v6
之外資料的時候,顯示成功。但是,待我們重新查詢檢視my_v6
資料的時候,發現並沒有真正更新成功。這是為什麼呢?原因就在於我們不能通過檢視去操作檢視之外的資料。舉一個不太恰當的例子,我們不能用自己手去操作別人兜裡的錢啊!
檢視演算法
檢視演算法,即系統對檢視以及外部查詢檢視的select
語句的一種解析方式。檢視演算法有三種,分別為:
undefined
:未定義(預設的),這不是一種實際使用的演算法,而是一個“推卸責任”的演算法。在未定義的情況下,告訴系統,檢視沒有定義演算法,請自己選擇。temptable
:臨時表演算法,系統先執行檢視的select
語句,後執行外部查詢語句。merge
:合併演算法,系統先將檢視對應的select
語句與外部查詢檢視的select
語句進行合併,然後再執行。此演算法比較高效,且在未定義演算法的時候,經常會預設選擇此演算法。
對於檢視的演算法,我們需要在建立檢視的時候指定,
- 基本語法:
create + [algorithm = temptable/merge/undefined] + view + 檢視名 + as + select語句;
執行如下 SQL 語句,進行測試:
-- 檢視檢視 my_v2 的預設演算法
show create view my_v2;
-- 指定檢視 my_v7 演算法為 temptable
create algorithm = temptable view my_v7 as
select * from student;
-- 檢視檢視 my_v7 的指定演算法
show create view my_v7;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如上圖所示,我們指定了檢視my_v7
的演算法為temptable
,但是對於演算法的選擇,我們該如何判斷呢?答案是:如果檢視的select
語句中包含一個查詢子句(五子句,包括where
、group
by
、order by
、having
和limit
),而且很有可能查詢子句的順序比外部的查詢語句的順序要靠後(五子句的順序),那麼一定要使用temptable
演算法,其他情況可以不用指定,預設即可。
至此,我們已經將檢視的內容大致講完了。有一點需要我們特別注意,那就是:檢視最重要的功能就是查詢,其他如增、刪、改的操作一般不會使用,也不建議通過檢視來操作基表的資料。
溫馨提示:符號[]
括起來的內容,表示可選項;符號+
,則表示連線的意思。