mysql之視圖

來源:互聯網
上載者:User

標籤:

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:未定義,自動,讓系統幫你選。

mysql之視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.