1.什么是視圖?
視圖是由查詢結果形成的一張虛擬表。
2.什么時候要用到視圖?
如果某個查詢結果出現的非常頻繁,也就是,要經常拿這個查詢結果來做子查詢
3.視圖的創建語法:
create view 視圖名 as select 語句;
4.使用視圖有什么好處呢?
①簡化查詢語句
比如:有一張商品表,我們經常要查每個欄目下商品的平均價格
select cat_id,avg(shop_price) from goods gropy by cat_id;
這時候我們就可以創建一張視圖:
create view avgPrice as select cat_id,avg(shop_price) from goods gropy by cat_id;
創建完,以后我們要查每個欄目的平均價格時,只要這么寫
select * from avgPrice;就可以了。
②可以進行權限控制
把表的權限封閉,但是開放相應的視圖權限,視圖里只開放部分數據列
比如我們的goods商品表,我們不想讓別人看到我們的銷售價格,這時候我們就可以把查看商品表的權限封閉,創建一張視圖
create view showGoods as select goods_id,goods_name from goods;
不出現銷售價格列就可以了。
③大數據分表時可以用到
比如表的行數據超過200萬行時,速度就會變慢
可以把一張表的數據拆成4張表來存放
News表
newsid 1,2,3,4...
news1,news2,news3,news4表
把一張表的數據分散到4張表里,分散的方法有很多,
最常用的是id取模來計算
id%4+1=[1,2,3,4]
...
還可以用視圖,把四張表形成一張視圖
create view news as select * from news1 union select * from news2 union ...
5.視圖的修改
alter view 視圖名 as select 語句;
6.視圖與表的關系
視圖是表的查詢結果,自然表的數據變了,會影響視圖的結果
7.那么視圖改變了會影響到表嗎?
①視圖的增刪改也會影響表;
②但視圖並不總是能增刪改的;
視圖的數據與表的數據一一對應時可以修改;
對於視圖的insert還應注意:視圖必須包含表中沒有默認值的列。
8.視圖的algorithm(運算規則)
algorithm = merge/temptable/undefined
merge:當引用視圖時,引用視圖的語句與定義視圖的語句合並
意味着視圖只是一個規則,語句規則,當查詢視圖時,把查詢視圖的語句
比如:where...那些與創建時的語句where子句等合並,分析,形成一條select語句。
舉個列子:
我們先創建一張視圖查詢所有商品價格大於3000的商品
create view g2 as select goods_id,goods_name,shop_price from goods where shop_price > 3000;
然后我們再查詢視圖的時候,再加上一個where條件<5000
select * from g2 where shop_price < 5000
這時候它就會把兩條語句合並分析最終形成這樣一條select語句
select goods_id,goods_name,shop_price from goods where shop_price > 3000 and shop_price < 5000;
temptable:是根據創建語句瞬間創建一張臨時表,然后查詢視圖的語句從該臨時表查數據
merge 和 temptalbe 有一個顯著的區別:
merge最終去查的還是goods表,而temptable去查的是虛擬表。
舉個例子:我們要得到每個欄目下最貴的商品
首先我們創建一張視圖查出每個欄目的商品按價格降序排序
create view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;
這時候我們在查詢這張視圖的時候再對cat_id進行分組是不是就能得到我們想要的結果呢?
select * from lmj group by cat_id;
答案是不能的,因為它把我們的創建視圖的語句和查詢視圖的語句合並成
select cat_id,goods_id,goods_name,shop_price from goods group by cat_id order by cat_id,shop_price desc;
而如果我們在創建視圖的時候指定了它的運算規則為:temptable
create algorithm=temptable view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;
然后我們再查詢視圖:select * frm lmj group by cat_id;就能得到我們想要的結果了。
它會先把select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;這句sql語句取到的結果放到一張臨時表,然后我們再從這張臨時表查自然能得到我們想要的結果了,而不是合並了再去查。
undefined:未定義,自動,讓系統幫你選。
大家要自己動手做個例子才能更快理解它們的區別。