MySQL高級-視圖、函數、存儲過程、觸發器

一、視圖
1、視圖的定義 
⑴ 視圖的定義
視圖是由查詢結果形成的一張虛擬表,是表通過某種運算得到的一個投影。同一張表可以創建多個視圖。
創建視圖的語法: 
create view view_name  as   select 語句
說明:
① 視圖名跟表名是一個級別的名字,隸屬於數據庫;
② 該語句的含義可以理解爲:就是將該select命名爲該名字(視圖名);
③ 視圖也可以設定自己的字段名,而不是select語句本身的字段名——通常不設置。
④ 視圖的使用,幾乎跟表一樣!


⑵ 視圖的作用:
① 可以簡化查詢。
案例1:查詢平均價格前3高的欄目。


案例2:查詢出商品表,以及所在的欄目名稱;


② 可以進行權限控制,
把表的權限封閉,但是開放相應的視圖權限,視圖裏只開放部分數據,比如某張表,用戶表爲例,2個網站搞合作,可以查詢對方網站的用戶,需要向對方開放用戶表的權限,但是呢,又不想開放用戶表中的密碼字段。
再比如一個goods表,兩個網站搞合作,可以相互查詢對方的商品表,比如進貨價格字段不能讓對方查看。


第一步:創建一個視圖,視圖中不能包含in_price字段。
語法: create view goods_v1 as select id,goods_name,shop_price  from goods;
第二步:創建一個用戶,授予查詢權限,只能操作goods_v1表(視圖)
語法:grant select on php.goods_v1  to ‘xiaotian’@’%’ identified by ‘1234456’;


第三步:我們就測試一下,


3、查詢視圖 
語法:select * from 視圖名 [where 條件] 
視圖和表一樣,可以添加where 條件
4、修改視圖 
alter   view   view_name  as   select   XXXX 

5、刪除視圖 
drop  view  視圖名稱


6、查看視圖結構 
和表一樣的,語法,desc 視圖名稱


7、查看所有視圖 
和表一樣,語法:show   tables;
注意:沒有show views語句;

8、視圖與表的關係 
視圖是表的查詢結果,自然表的數據改變了,影響視圖的結果。
(1)視圖的數據與表的數據一一對應時,可以修改。


(2)視圖增刪該也會影響表,但是視圖並不是總是能增刪該的。


注意:視圖的數據與表的數據一一對應時,可以修改,
(3)對於視圖insert還應注意,視圖必須包含表中沒有默認值的列。

以上對user_v1的操作,就類似於,如下sql語句的操作,原因就是age字段沒有默認值,我們裏面,沒有包含age字段,
注意:一般來說,視圖只是用來查詢的,不應該執行增刪改的操作。
9、視圖算法
algorithm=   merge/temptable/undefined 
merge:當引用視圖時,引用視圖的語句與定義視圖的語句合併(默認)。
temptable:當引用視圖時,根據視圖的創建語句建立一個臨時表。
undefined:未定義,自動讓系統幫你選。
merge:意味着,視圖只是一個語句規則,當查詢視圖時,把查詢視圖的語句(比如where那些)與創建時的語句where子句等合併,分析,形成一條 select語句。
temptable:是根據創建語句瞬間創建一張臨時表,然後查詢視圖的語句,從該臨時表查數據。
比如如下視圖的算法爲merge
#在創建視圖時的語句:where shop_price>1000; 
#查詢視圖時,where shop_price<3000; 
#那麼查此視圖時,真正發生的是where (select where) and (view where) 
#where shop_price <3000 and shop_price >1000; 
#分析出最終語句還是去查goods表


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章