本文講述MySql5.x中視圖的使用,包括創(chuàng)建視圖、修改視圖和刪除視圖的相關(guān)知識,包括命令的語法、使用舉例以及注意事項(xiàng)。
一. 視圖概述
視圖是一個(gè)虛擬表,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動態(tài)生成。
對其中所引用的基礎(chǔ)表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當(dāng)前或其它數(shù)據(jù)庫的一個(gè)或多個(gè)表,或者其它視圖。通過視圖進(jìn)行查詢沒有任何限制,通過它們進(jìn)行數(shù)據(jù)修改時(shí)的限制也很少。
二. 創(chuàng)建視圖——CREATE VIEW
1. 語法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW [db_name.]view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
通過該語句可以創(chuàng)建視圖,若給定了[OR REPLACE],則表示當(dāng)已具有同名的視圖時(shí),將覆蓋原視圖。select_statement是一個(gè)查詢語句,這個(gè)查詢語句可從表或其它的視圖中查詢。視圖屬于數(shù)據(jù)庫,因此需要指定數(shù)據(jù)庫的名稱,若未指定時(shí),表示在當(dāng)前的數(shù)據(jù)庫創(chuàng)建新視圖。
表和數(shù)據(jù)庫共享數(shù)據(jù)庫中相同的名稱空間,因此,數(shù)據(jù)庫不能包含相同名稱的表和視圖,并且,視圖的列名也不能重復(fù)。
2. 使用舉例
Eg. 本例創(chuàng)建一個(gè)產(chǎn)品表(product)和一個(gè)購買記錄表(purchase),再通過視圖purchase_detail查詢出購買的詳細(xì)信息。
CREATE TABLE product
(
product_id INT NOT NULL,
name VARCHAR(50) NOT NULL,
price DOUBLE NOT NULL
);
INSERT INTO product VALUES(1, 'apple ', 5.5);
CREATE TABLE purchase
(
id INT NOT NULL,
product_id INT NOT NULL,
qty INT NOT NULL DEFAULT 0,
gen_time DATETIME NOT NULL
);
INSERT INTO purchase VALUES(1, 1, 10, NOW());
CREATE VIEW purchase_detail AS SELECT product.name as name, product .price as price, purchase.qty as qty, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;
創(chuàng)建成功后,輸入:SELECT * FROM purchase_detail;
運(yùn)行效果如下:
+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple | 5.5 | 10 | 55 |
+-------+-------+-----+-------------+
1 row in set (0.01 sec)
3. 注意事項(xiàng)
創(chuàng)建視圖存在如下注意事項(xiàng):
(1) 運(yùn)行創(chuàng)建視圖的語句需要用戶具有創(chuàng)建視圖(CRATE VIEW)的權(quán)限,若加了[OR REPLACE]時(shí),還需要用戶具有刪除視圖(DROP VIEW)的權(quán)限;
(2) SELECT語句不能包含FROM子句中的子查詢;
(3) SELECT語句不能引用系統(tǒng)或用戶變量;
(4) SELECT語句不能引用預(yù)處理語句參數(shù);
(5) 在存儲子程序內(nèi),定義不能引用子程序參數(shù)或局部變量;
(6) 在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句;
(7) 在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖;
(8) 在視圖定義中命名的表必須已存在;
(9) 不能將觸發(fā)程序與視圖關(guān)聯(lián)在一起;
(10) 在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進(jìn)行了選擇,而該視圖使用了具有自己ORDER BY的語句,它將被忽略。
三. 修改視圖——ALTER VIEW
1. 語法
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
該語句用于更改已有視圖的定義。其語法與CREATE VIEW類似。
2. 使用舉例
Eg. 將上一小節(jié)中中創(chuàng)建的視purchase_detail進(jìn)行修改,去掉qty列,語句如下:
ALTER VIEW purchase_detail AS SELECT product.name as name, product .price as price, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;
此時(shí)通過語句:select * from purchase_detail;對視圖進(jìn)行查詢時(shí),結(jié)果如下:
+-------+-------+-------------+
| name | price | total_value |
+-------+-------+-------------+
| apple | 5.5 | 55 |
+-------+-------+-------------+
3. 注意事項(xiàng)
修改視圖的注意事項(xiàng)除了第一條外跟創(chuàng)建視圖的注意事項(xiàng)是一樣的。第(1)條應(yīng)改為:
該語句需要具有針對視圖的CREATE VIEW和DROP權(quán)限,也需要針對SELECT語句中引用的每一列的某些權(quán)限。
四. 刪除視圖——DROP VIEW
1. 語法
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
該語句用戶刪除視圖,可一次刪除多個(gè)視圖。[IF EXISTS]選項(xiàng)確保語句正確運(yùn)行。若沒有該子句,當(dāng)指定的視圖不存在時(shí),將發(fā)生錯(cuò)誤。
2. 使用舉例
Eg1. 刪除在前面的小節(jié)中創(chuàng)建的視圖purchase_detail:DROP VIEW purchase_detail;
Eg2. 刪除一個(gè)未知的視圖:DROP VIEW IF EXISTS test_view;
Eg3. 刪除多個(gè)視圖:DROP VIEW IF EXISTS test_view1, test_view2;
3. 注意事項(xiàng)
必須對要刪除的一個(gè)或多個(gè)視圖擁有DROP VIEW的權(quán)限。
posted on 2007-12-26 16:39
阿蜜果 閱讀(4010)
評論(2) 編輯 收藏 所屬分類:
MySql