• mysql 视图


    一.             视图概述

           视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

    对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

    视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。

     

      视图:查看图形或文档的方式。

     

      视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。

     

      所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。

     

      视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

     

      当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

     

      视图有很多优点,主要表现在:

     

      •视点集中

     

      •简化操作

     

      •定制数据

     

      •合并分割数据

     

      •安全性

    二.             创建视图——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 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;

    创建成功后,输入: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 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.       注意事项

    修改视图的注意事项除了第一条外跟创建视图的注意事项是一样的。第(1)条应改为:

    该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。

    四.             删除视图——DROP VIEW

    1.       语法

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

    该语句用户删除视图,可一次删除多个视图。[IF EXISTS]选项确保语句正确运行。若没有该子句,当指定的视图不存在时,将发生错误。

    2.       使用举例

    Eg1. 删除在前面的小节中创建的视图purchase_detail:DROP VIEW purchase_detail;

    Eg2. 删除一个未知的视图:DROP VIEW IF EXISTS test_view;

    Eg3. 删除多个视图:DROP VIEW IF EXISTS test_view1, test_view2;

    3.       注意事项

    必须对要删除的一个或多个视图拥有DROP VIEW的权限。

  • 相关阅读:
    Lync二次开发
    Socket 一对多通信
    DBImport V3.1 数据互导工具及文档生成器更新发布
    Sql学习第六天——SQL 巩固练习(用到了前几天几个知识点)
    文件监控
    Google Protocol Buffers 入门
    [原]常用Linux命令总结[Thx for commandlinefu]
    清理SQL Server日志释放文件空间
    ASP.NET MVC动态二级域名及ASP.NET管道机制
    搜索引擎——JobSearch简介
  • 原文地址:https://www.cnblogs.com/aprils/p/4874317.html
Copyright © 2020-2023  润新知