第8章 视图

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

8.1 视图简介

视图的作用是方便用户对数据的操作。

8.1.1 视图的含义

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。
    视图还可以从已经存在的视图的基础上定义。
    数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。
    因此,视图中的数据是依赖于原来的表中的数据的。
    一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
    MySQL的视图不支持输入参数的功能,因此交互性上还有欠缺。但对于不是很大的操作,使用视图可以很大程度上简化用户的操作。

8.1.2 视图的作用

1.使操作简单化
        视图需要达到的目的就是所见即所需。
        视图可以简化对数据的操作。
    2.增加数据的安全性
        通过视图,用户只能查询和修改指定的数据。
        数据库授权命令可以限制用户的操作权限,但不能限制到特定行和列上。
        使用视图,可以简单方便地将用户的权限限制到特定的行和列上。这样可以保证一些机密信息的安全。
    3.提高表的逻辑独立性

8.2 创建视图

8.2.1 创建视图的语法形式

语法形式:
    CREATE [ ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE} ]
             VIEW 视图名 [( 属性清单 )]
             AS SELECT 语句
             [ WITH  [ CASCADED | LOCAL ]  CHECK  OPTION ];
    创建视图时,需要有CREATE VIEW的权限。同时,应该具有查询涉及的列的SELECT权限。
    在MySQL数据库下面的user表中保存这些权限信息,可以使用SELECT语句查询。
    SELECT语句查询的方式如下:
    SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='用户名'
    详细说明见书上。

8.2.2 在单表上创建视图

创建视图的代码eg:
        CREATE VIEW department_view1
        AS SELECT * FROM department;

8.2.3 在多表上创建视图

MySQL中也可以在两个或两个以上的表上创建视图,也是使用CREATE VIEW语句实现的。
    例如:CREATE ALGORITHM=MERGE VIEW
                worker_view1 (name, department, sex, age, address)
                AS SELECT name, department.d_name, sex, 2009-birthday, address
                FROM worker, departmment, WHERE worker.d_id=department.d_id
                WITH LOCAL CHECK OPTION

8.3 查看视图

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

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

基本形式:
        DESCRIBE 视图名;
    eg:
        DESCRIBE worker_view1;

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

语法:
        SHOW TABLE STATUS LIKE '视图名';
    eg:
        SHOW TABLE STATUS LIKE 'worker_view1';

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

语法:
        SHOW CREATE VIEW 视图名;
    eg:
        SHOW CREATE VIEW worker_view1;

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

SELECT * FROM information_schema.views;

8.4 修改视图

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

8.4.1 CREATE OR REPLACE VIEW语句修改视图

CREATE OR REPLACE VIEW的使用非常灵活:
    在视图已经存在的情况下,对视图进行修改;
    视图不存在时,可以创建视图。
    语法:
        CREATE OR REPLACE  [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE} ]
                             VIEW 视图名 [( 属性清单 )]
                             AS SELECT 语句
                             [ WITH  [CASCADED | LOCAL ]  CHECK  OPTION];
                             CREATE  OR  REPLACE  ALGORITHM=TEMPLATE
                             VIEW  department_view1 (department, function, location )
                             AS  SELECT d_name, function, address  FROM department;

8.4.2 ALTER语句修改视图

在MySQL中,ALTER语句的作用:
        修改表的定义;
        创建索引;
        修改视图。
    语法:
        ALTER  [ ALGORITHM={UNDEFINED | MERGE | TEMPTABLE} ]
                 VIEW 视图名 [( 属性清单 )]
                 AS  SELECT 语句
                 [ WITH  [ CASCADED | LOCAL ]   CHECK  OPTION ];

8.5 更新视图

更新视图是指通过视图来插入(INSERT)、更新(UPDATE)、删除(DELETE)表中的数据。
    因为视图是一个虚拟表,所以其中没有数据。
    通过视图更新时,都是转换到基本表来更新。
    更新视图时,只能更新权限范围内的数据,超出了范围,就不能更新。
    注意:
    视图中虽然可以更新数据,但是有很多限制。
    一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。
    因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。

8.6 删除视图

删除视图时,只能删除视图的定义,不会删除数据。
    MySQL中,使用DROP VIEW来删除视图。但是用户必须拥有DROP权限。
    语法:
        DROP VIEW [IF EXISTS] 视图名列表 [RESTRICT  |  CASCADE]
    其中,IF EXISTS参数指判断视图存在,如果存在则执行,不存在则不执行;“视图名列表”参数表示要删除的视图的名称的列表。

8.8 常见问题及解答

1.MySQL中视图和表的区别及联系是什么?
        区别:
        (1)视图是按照SQL语句生成的一个虚拟的表;
        (2)视图不占实际的物理空间,而表中的记录需要占物理空间;
        (3)建立和删除视图只影响视图本身,不会影响实际的记录。而建立和删除表会影响实际的记录。
        联系:
        (1)视图是建立在表之上的表,其字段和记录都来自基本表,其依赖基本表而存在;
        (2)一个视图可以对应一个基本表,也可以对应多个基本表;
        (3)视图是基本表的抽象,在逻辑意义上建立的新关系。
    2.为什么视图更新不了?
    可能的原因:
        视图中包含SUM()、COUNT()、MAX()、MIN()等函数;
        视图中包含UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等关键字;
        视图是一个常量视图,而且该列没有包含在视图中等。

参考文献:
1.《MySQL入门很简单》