posts - 297,  comments - 1618,  trackbacks - 0
           

          本文講述MySql5.x中視圖的使用,包括創(chuàng)建視圖、修改視圖和刪除視圖的相關知識,包括命令的語法、使用舉例以及注意事項。

          一.             視圖概述

                 視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。

          對其中所引用的基礎表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其它數(shù)據(jù)庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數(shù)據(jù)修改時的限制也很少。

          二.             創(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],則表示當已具有同名的視圖時,將覆蓋原視圖。select_statement是一個查詢語句,這個查詢語句可從表或其它的視圖中查詢。視圖屬于數(shù)據(jù)庫,因此需要指定數(shù)據(jù)庫的名稱,若未指定時,表示在當前的數(shù)據(jù)庫創(chuàng)建新視圖。

          表和數(shù)據(jù)庫共享數(shù)據(jù)庫中相同的名稱空間,因此,數(shù)據(jù)庫不能包含相同名稱的表和視圖,并且,視圖的列名也不能重復。

          2.       使用舉例

          Eg. 本例創(chuàng)建一個產品表(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 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;

          運行效果如下:

          +-------+-------+-----+-------------+

          | name | price | qty | total_value |

          +-------+-------+-----+-------------+

          | apple |   5.5 | 10 |          55 |

          +-------+-------+-----+-------------+

          1 row in set (0.01 sec)

          3.       注意事項

          創(chuàng)建視圖存在如下注意事項:

          (1)       運行創(chuàng)建視圖的語句需要用戶具有創(chuàng)建視圖(CRATE VIEW)的權限,若加了[OR REPLACE]時,還需要用戶具有刪除視圖(DROP VIEW)的權限;

          (2)       SELECT語句不能包含FROM子句中的子查詢;

          (3)       SELECT語句不能引用系統(tǒng)或用戶變量;

          (4)       SELECT語句不能引用預處理語句參數(shù);

          (5)       在存儲子程序內,定義不能引用子程序參數(shù)或局部變量;

          (6)       在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句;

          (7)       在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖;

          (8)       在視圖定義中命名的表必須已存在;

          (9)       不能將觸發(fā)程序與視圖關聯(lián)在一起;

          (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. 將上一小節(jié)中中創(chuàng)建的視purchase_detail進行修改,去掉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;

          此時通過語句:select * from purchase_detail;對視圖進行查詢時,結果如下:

          +-------+-------+-------------+

          | name | price | total_value |

          +-------+-------+-------------+

          | apple |   5.5 |          55 |

          +-------+-------+-------------+

          3.       注意事項

          修改視圖的注意事項除了第一條外跟創(chuàng)建視圖的注意事項是一樣的。第(1)條應改為:

          該語句需要具有針對視圖的CREATE VIEWDROP權限,也需要針對SELECT語句中引用的每一列的某些權限。

          四.             刪除視圖——DROP VIEW

          1.       語法

          DROP VIEW [IF EXISTS]
              view_name [, view_name] ...
              [RESTRICT | CASCADE]

          該語句用戶刪除視圖,可一次刪除多個視圖。[IF EXISTS]選項確保語句正確運行。若沒有該子句,當指定的視圖不存在時,將發(fā)生錯誤。

          2.       使用舉例

          Eg1. 刪除在前面的小節(jié)中創(chuàng)建的視圖purchase_detailDROP VIEW purchase_detail;

          Eg2. 刪除一個未知的視圖:DROP VIEW IF EXISTS test_view;

          Eg3. 刪除多個視圖:DROP VIEW IF EXISTS test_view1, test_view2;

          3.       注意事項

          必須對要刪除的一個或多個視圖擁有DROP VIEW的權限。

          posted on 2007-12-26 16:39 阿蜜果 閱讀(4014) 評論(2)  編輯  收藏 所屬分類: MySql


          FeedBack:
          # re: 【MySql學習系列】視圖
          2007-12-27 20:18 | BeanSoft
          非常不錯!支持!  回復  更多評論
            
          # re: 【MySql學習系列】視圖
          2011-08-05 10:38 | 趙峰
          @BeanSoft
          非常感謝博主提供這篇文章,在下受教了!  回復  更多評論
            
          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296370
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵定县| 昔阳县| 和林格尔县| 全椒县| 镇坪县| 巴里| 永安市| 赞皇县| 太康县| 台湾省| 桐城市| 乐至县| 广安市| 秀山| 德惠市| 镇平县| 武胜县| 永善县| 墨脱县| 策勒县| 庆阳市| 周宁县| 虞城县| 望奎县| 清苑县| 阜城县| 长阳| 西昌市| 祁阳县| 武安市| 湘阴县| 土默特左旗| 枣强县| 桃源县| 措勤县| 漳平市| 峨眉山市| 昭苏县| 乌兰察布市| 昆山市| 烟台市|