• 视图(简介,创建,查看,修改,更新,删除)


    一、视图简介

    视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。用户可以不用看到数据库中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。

    1、视图的含义

    视图是一种虚拟的表,是从数据库中的一个表或多个表中导出来的表,视图还可以从已经存在的视图的基础上定义。数据库只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

    2、视图的作用

    视图是在原有的表或者视图的基础上重新定义的虚拟表,这可以从原有的表上选取对用户有用的信息。视图起着类似于筛选的作用。

    2.1 使用操作简单化,视图需要达到的目的就是所见即所需。

    2.2 增加数据的安全性,通过视图,用户只能查询和修改指定的数据。

    2.3 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。

    二、创建视图

    创建视图是指已存在的数据库上建立视图。视图可以建立在一张表或多张表中。

    1、创建视图的语法形式

    MySQL中,创建视图是通过 SQL 语句 CREATE VIEW 实现的。其基本语法如下:

    CREATE  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

      VIEW  视图名  [(属性清单)]

      AS  SELECT  语句

      [WITH  [CASCADED | LOCAL]  CHECK  OPTION];

    其中,ALGORITHM 是可选参数,表示视图选择的算法;视图名  参数表示创建的视图的名称;属性清单  是可选参数,其指定了视图中各个属性的名词,默认情况下与 SELECT 语句中查询的属性相同;SELECT 语句参数是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中;WITH  CHECK  OPTION 是可选参数,表示更新视图时要保证在该视图的权限范围之内。

    ALGORITHM  包括 3 个选项  UNDEFINEDMERGE TEMPTABLE。其中,UNDEFINED 选项表示MySQL 将自动选择所要使用的算法;MERGE 选项表示将使用视图的语句与视图的定义合并起来,使得视图定义的某一部分取代语句的对应部分;TEMPTABLE 选项表示将视图的结果存入临时表,然后使用临时表执行语句。

    CASCADED 是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL 表示更新视图时,要满足该视图本身的定义的条件即可。

    CREATE VIEW 创建视图时,最好加上WITH CHECK OPTION 参数。而且最好加上CASCADED 参数。这样,从视图上派生出来的新视图后,更新新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性。

    创建视图时,需要有 CREATE VIEW 的权限。同时,应该具有查询涉及的列的 SELECT 权限。SELECT 语句查询方式如下:

    SELECT   Select_priv,Create_view_priv  FROM  mysql.user  WHERE  user='用户名'

    其中,Select_priv 属性表示用户是否具有 SELECT 权限,Y表示拥有 SELECT 权限,N 表示没有;,Create_view_priv 属性表示用户是否具有 CREATE VIEW 权限;mysql.user 表示MySQL数据库下面的user表;用户名  参数表示要查询的那个用户是否拥有前面列举的权限,该参数用单引号引起来。

    1.1 在单表上创建视图

    mysql> CREATE VIEW index2_view AS SELECT * FROM index2; index2 表上创建名称为index2_view的视图。

    mysql> CREATE VIEW index1_view(v_id,name,sex) AS SELECT id,name,sex FROM index1; index1表上创建index1_view的视图。

    mysql> desc index1_view; 查看刚index1_view视图。

    1.2 在多表上创建视图

    mysql> CREATE ALGORITHM=MERGE VIEW

        -> worker_view(name,department,sex,age,address)

        -> AS SELECT name,department.d_name,sex,2009-brithday,address

        -> FROM worker,department WHERE worker.d_id= department.d_id

        -> WITH LOCAL CHECK OPTION;

    三、查看视图

    查看视图是指查看数据库中已存在的视图的定义。查看视图必须要有的SHOW  VIEW 的权限,MySQL数据库下的user表中保存着这个信息。查看视图的方法包括 DESCRIBE 语句、SHOW TABLE STATUS 语句、SHOW CREATE VIEW 语句和查询information_schema数据库下的views 表等。

    1DESCRIBE语句查看视图基本信息

    因为,视图也是一张表。只是这张表比较特殊,是一张虚拟的表。同样可以使用DESCRIBE语句查看视图。基本语法如下:

    DESCRIBE  视图名; 其中,视图名   参数指所要查看的视图的名称。

    DESC   worker_view; 查看worker_view视图基本信息。

    2SHOW TABLE STATUS  语句查看视图基本信息

    基本语法: SHOW  TABLE  STATUS LIKE  '视图'  ; 其中,LIKE  表示后面匹配的是字符串;视图名  参数指要查看的视图的名称,需要用单引号引起来。

    mysql> SHOW TABLE STATUS LIKE 'index1_view' G 查看视图index1_view,加上G 查看的格式更整齐。

    3SHOW CREATE VIEW 语句查看视图详细信息

    基本语法: SHOW  CREATE  VIEW  视图名

    mysql> SHOW CREATE VIEW index2_view1; 这个查看视图显示数据有点乱

    mysql> SHOW CREATE VIEW index2_view1 G 查看视图信息显示整齐

    4、在views 表中查看视图详细信息

    MySQL 中,所有视图的定义都存在 information_schema 数据库下的 views 表中。查询views 表,可以查看到数据库中所有视图的详细信息。

    基本语法: SELEC  *  FROM  information_schema.views;

    mysql> SELECT * FROM information_schema.views G

    四、修改视图

    修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。

    1CREATE   OR  REPLACE  VIEW  语句修改视图

    基本语法(所有参数都与创建视图的参数是一样的)如下:

    CREATE  OR  REPLACE  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

    VIE  视图名  [(属性清单)]

    AS  SELECT  语句

    [WITH  [CASCADED | LOCAL ]  CHECK  OPTION];

    修改index1_view视图,修改后可以使用DESC查看效果

    mysql> CREATE OR REPLACE ALGORITHM=TEMPTABLE

        -> VIEW index1_view(v_name,v_sex)

        -> AS SELECT name,sex FROM index1;

    2ALTER 语句修改视图

    ALTER语句可以修改表的定义,创建索引,还可以用来修改视图。基本语法(所有参数都跟创建视图的参数是一样的)

    ALTER  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

    VIEW  视图名  [(属性清单)]

    AS  SELECT 语句

    [WITH  [CASCADED | LOCAL]  CHECK  OPTION];

    mysql> ALTER VIEW department_view2(department,name,sex,location)

        -> AS SELECT d_name,worker.name,worker.sex,address

        -> FROM department,worker WHERE department.d_id=work.d_id

        -> WITH CHECK OPTION;

    五、更新视图

    更新视图是指通过视图来插入(INSERT)、更新(UPDATE) 和删除(DELETE) 表中的数据。因为视图是一个虚拟表,其中没有数据,通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。

    mysql> create databases test2; 创建数据库test2

    mysql> CREATE TABLE department(d_id INT PRIMARY KEY,

        -> d_name VARCHAR(20),

        -> function VARCHAR(100),

        -> address VARCHAR(50)

        -> ); 创建department

    mysql> INSERT INTO department(d_id,d_name,function,address) VALUES(1001,"ministry of personnel","Management personnel change","3 floor, tower "); 在表department中插入一行

    mysql> INSERT INTO department(d_id,d_name,function,address) VALUES(1002,"ministry of personnel",,"In charge of production","1 floor, tower 5"); 在表department中再插入一行

    mysql> SELECT * FROM department; 查看来自于department的信息

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

    | d_id | d_name                | function                    | address          |

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

    | 1001 | ministry of personnel | Management personnel change | 3 floor, tower   |

    | 1002 | ministry of personnel | In charge of production     | 1 floor, tower 5 |

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

    2 rows in set (0.02 sec)

    mysql> CREATE VIEW department_view(name,function,address)

          -> AS SELECT d_name,function,address FROM department WHERE d_id=1001;用表department创建视图department_view

    mysql> UPDATE department_view SET name='Scientific research',function='New product development',address='5 floor, tower 3'; 更新视图department_view

    mysql> SELECT * FROM department;

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

    | d_id | d_name                | function                | address          |

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

    | 1001 | Scientific research   | New product development | 5 floor, tower 3 |

    | 1002 | ministry of personnel | In charge of production | 1 floor, tower 5 |

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

    2 rows in set (0.00 sec)

    由上面可以看出,对视图的更新最后都是实现在基本表上。更新视图实际上更新的是基本表上的记录。但是,并不是所有的视图都可以更新,以下几情况不能更新视图:

     视图中包含 SUM()COUNT()MAX()、和 MIN() 等函数;

     视图中包含 UNIONUNION ALLDISTINCTGROUP BY HAVIG 等关键字;

     常量视图;

     视图中的 SELECT中包含子查询;

     由不可更新的视图导出的视图;

     创建视图时,ALGORITHM TEMPTABLE类型;

     视图对应的表上存在没有默认值的列,而且该列没有包含在视图里;

     WITH [CASCADED | LOCAL] CHECK OPTION 也将决定视图能否更新。LOCAL参数表示更新视图时要满足该视图本身的定义条件即可;CASCADED 参数表示更新视图时要满足所有相关视图和表的条件。没有指明时,默认为CASCADED

    六、删除视图

    删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL中,使用 DROP VIEW 语句来删除视图。但是用户必须拥有 DROP 权限。基本语法如下:

    DROP  VIEW  [IF  EXISTS]  视图名列表  [RESTRICT | CASCADE]

    其中,IF EXISTS  参数指判断视图存在,如果存在则执行,不存在则不执行;视图名列表  参数表示要删除的视图的名称列表,各个视图名称之间用逗号隔开。

    mysql> DROP VIEW IF EXISTS worker_view1,worker_view2; 同时删除视图worker_view1worker_view2

    mysql> SELECT Drop_priv FROM mysql.user WHERE user='root'; 查看root用户的 Drop_priv权限

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

    | Drop_priv |

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

    | Y         |

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

    1 row in set (0.00 sec)

  • 相关阅读:
    C# 两个窗体中相互切换的方法
    Linq对DataTable数据的分组统计
    如何让窗体大小随着控件的大小变化而变化
    两张表解决用户自定义数据库之思路
    picturebox显示用字符串代表图片名称的(已导入资源的)图片
    如何将access高版本数据库保存为低版本的?
    Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别
    条件编译解决AutoCAD多版本问题
    一个爬取股票信息的爬虫程序
    Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
  • 原文地址:https://www.cnblogs.com/uphold/p/11221985.html
Copyright © 2020-2023  润新知