1. 程式人生 > >mysql學習五:檢視下

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

1

  • 限制 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

2

如上圖所示,在我們新建的檢視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

3

如上圖所示,顯然我們通過單表檢視向基表中插入資料成功啦!

刪除資料

與新增資料類似,

  • 多表檢視不能刪除資料;
  • 單表檢視可以刪除資料。

執行如下 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

4

更新資料

理論上,無論多表檢視還是單表檢視,都可以進行資料的更新。

執行如下 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

5

此外,更新檢視資料並不總是成功的,這是因為有更新限制的存在。那麼何為更新限制呢?

  • 更新限制: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

6

如上圖所示,在更新檢視的時候,更新失敗,這是因為其違反了我們設定的更新限制。那麼,檢視之外的資料,我們能不能修改呢?執行如下 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

7

如上圖所示,更新檢視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

8

如上圖所示,我們指定了檢視my_v7的演算法為temptable,但是對於演算法的選擇,我們該如何判斷呢?答案是:如果檢視的select語句中包含一個查詢子句(五子句,包括wheregroup byorder by 、havinglimit),而且很有可能查詢子句的順序比外部的查詢語句的順序要靠後(五子句的順序),那麼一定要使用temptable演算法,其他情況可以不用指定,預設即可。

至此,我們已經將檢視的內容大致講完了。有一點需要我們特別注意,那就是:檢視最重要的功能就是查詢,其他如增、刪、改的操作一般不會使用,也不建議通過檢視來操作基表的資料

溫馨提示:符號[]括起來的內容,表示可選項;符號+,則表示連線的意思。