視圖起因: 查詢每個欄目最貴的商品=>
selectgoods_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc; 查詢結果,當成一張表看
如果某個查詢結果出現的非常頻繁,也就是說,拿這個結果進行子查詢出現的非常頻繁.
createtable g2 like goods;insert into g2 select ….
上面兩句,是想保存一個查詢結果到表裡面,供其它查詢用。
視圖定義: 視圖是由查詢結果形成的一張虛擬表。
mysql>CREATE TABLE t (qty INT, price INT);
mysql>INSERT INTO t VALUES(3, 50);
mysql>CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql>SELECT * FROM v;
為什麼需要視圖?
a、簡化查詢語句
b、可以控制列權限
把表的權限封閉,但是開放相對應的視圖權限。視圖裡只開放部分列部分數據
c、大數據分表時可以用視圖把所分的表形成一張視圖
測試時用到的表結構及數據
create table t
(id int primary keyauto_increment,
type tinyint unsigned,
name char(5) not nulldefault '',
money tinyint unsigned
)engine=myisamcharset=utf8;
insert intot(type,name,money) values(1,'1a',4),
(1,'1b',3),(2,'2a',3),(1,'1c',4),(2,'2b',5),(3,'3a',5);
問題1: 視圖是表的查詢結果,因此表的數據改變了,會影響視圖的結果
修改原始表t的id為6的數據
查看視圖:
問題2: 視圖改變了呢?
情況一:視圖的數據與表的數據一一對應,如上述例子中的表t與視圖t_view1
1、修改視圖t_view1的id為6的數據
查看原始表t
2、往視圖t_view1插入數據
查看原始表t
3、刪除視圖t_view1id為7的數據
查看原始表t
情況2: 視圖只是原始表的統計結果,並不與原始表數據一一對應
(備注: 創建統計t表相同type的money字段總和的視圖)
試著修改下視圖t_view2的數據
假設可以進行修改,那麼type為1的money總和加上3後,怎麼對應原始表各個type為1的數據。顯然,這是沒辦法的。因此報錯
從上面這兩種情況,得到:
1、視圖增刪改也會影響表,但是,視圖並不總能增刪改
2、視圖的數據與表的數據一一對應時,則可以
3、對於視圖insert還應注意,視圖必須包含表中沒有默認值的列
四、視圖的種類
4.1、查看視圖創建語法
針對algorithm的用法:
a、undefined: 由系統默認
b、merge:當algorithm為此值時,創建的視圖只是單純的sql語句存在而不是以虛擬結果表的形式存在。但使用此視圖時,創建視圖的sql語句會與後面的sql語句進行優化,最後得到一條新的sql語句
以merge視圖的方式,求得表t中type相同的money最大值
再對視圖t_view3進行分組
顯然,這個結果不是我們想要的結果。運行 上述sql語句等同於
這是因為merge不是以虛擬結果表存在,而僅僅是sql語句,因此會與後面的sql語句進行優化後,再進行執行。
c、temptable:會把視圖當做虛擬結果表
以temptable視圖的方式,求得表t中type相同的money最大值
再進行對type進行分組
從上面這兩種情況,得到:
創建視圖建議指定視圖的類型為臨時表