mysql5中視圖的使用

一.
視圖概述
       視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。
二.
創建視圖——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]通過該語句可以創建視圖,若給定了[OR REPLACE],則表示當已具有同名的視圖時,將覆蓋原視圖。select_statement是一個查詢語句,這個查詢語句可從表或其它的視圖中查詢。視圖屬於數據庫,因此需要指定數據庫的名稱,若未指定時,表示在當前的數據庫創建新視圖。
表和數據庫共享數據庫中相同的名稱空間,因此,數據庫不能包含相同名稱的表和視圖,並且,視圖的列名也不能重複。
2.
使用舉例
Eg. 本例創建一個產品表(product)和一個購買記錄表(purchase),再通過視圖purchase_detail查詢出購買的詳細信息。
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 SELECTproduct.name as name, product .price as price, purchase.qty as qty,product .price * purchase.qty as total_value from product, purchasewhere product.product_id = purchase.product_id;
創建成功後,輸入:SELECT * FROM purchase_detail;
運行效果如下:
+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple |   5.5 | 10 |          55 |
+-------+-------+-----+-------------+
1 row in set (0.01 sec)
3.
注意事項
創建視圖存在如下注意事項:
(1)
運行創建視圖的語句需要用戶具有創建視圖(CRATE VIEW)的權限,若加了[OR REPLACE]時,還需要用戶具有刪除視圖(DROP VIEW)的權限;
(2)
SELECT語句不能包含FROM子句中的子查詢;
(3)
SELECT語句不能引用系統或用戶變量;
(4)
SELECT語句不能引用預處理語句參數;
(5)
在存儲子程序內,定義不能引用子程序參數或局部變量;
(6)
在定義中引用的表或視圖必須存在。但是,創建了視圖後,能夠捨棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句;
(7)
在定義中不能引用TEMPORARY表,不能創建TEMPORARY視圖;
(8)
在視圖定義中命名的表必須已存在;
(9)
不能將觸發程序與視圖關聯在一起;
(10)
在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己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. 將上一小節中中創建的視purchase_detail進行修改,去掉qty列,語句如下:
ALTER VIEW purchase_detail AS SELECTproduct.name as name, product .price as price, product .price *purchase.qty as total_value from product, purchase whereproduct.product_id = purchase.product_id;
此時通過語句:select * from purchase_detail;對視圖進行查詢時,結果如下:
+-------+-------+-------------+
| name | price | total_value |
+-------+-------+-------------+
| apple |   5.5 |          55 |
+-------+-------+-------------+
3.
注意事項
修改視圖的注意事項除了第一條外跟創建視圖的注意事項是一樣的。第(1)條應改爲:
該語句需要具有針對視圖的CREATE VIEWDROP權限,也需要針對SELECT語句中引用的每一列的某些權限。
四.
刪除視圖——DROP VIEW
1.
語法
DROP VIEW [IF EXISTS]    view_name [, view_name] ...    [RESTRICT | CASCADE]該語句用戶刪除視圖,可一次刪除多個視圖。[IF EXISTS]選項確保語句正確運行。若沒有該子句,當指定的視圖不存在時,將發生錯誤。
2.
使用舉例
Eg1. 刪除在前面的小節中創建的視圖purchase_detailDROP VIEW purchase_detail;
Eg2. 刪除一個未知的視圖:DROP VIEW IF EXISTS test_view;
Eg3. 刪除多個視圖:DROP VIEW IF EXISTS test_view1, test_view2;
3.
注意事項
必須對要刪除的一個或多個視圖擁有DROP VIEW的權限。

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