3 视图
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。视图是虚拟表,是从数据库中一个或多个表中导出的表。数据库中只存放了表的定义而并没有存放视图中的数据。这些数据还存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据依赖于原来的表中的数据。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
如果经常需要从多个表中查询指定字段的数据,可以在这些表上建立一个视图。通过这个视图显示这些字段的数据。如果表中修改了与视图相关的字段的名称,可以通过修改视图来解决可能引起的问题。
3.1 视图的作用
视图是在原有的表或视图的基础上重新定义的虚拟表,这可从原有的表上选取对用户有用的信息,而对用户没用或者用户没有权限了解的信息可以直接屏蔽掉。这样做可以简化应用,也保证了系统的安全,起着类似于筛选的作用。视图作用可归纳为以下几点:
使操作简单化
视图需要达到的目的就是所见即所需。也即是说,从视图看到的信息就是所需要了解的信息。视图可以简化对数据的操作。
增加数据的安全性
通过视图,用户只能查询和修改指定的数据。指定数据以外的信息,用户根本接触不到。数据库授权命令可以限制用户的操作权限,但不能限制到特定的行和列上。使用视图后,可以简单方便地将用户的权限限制到特定的行和列上。这样既可以保证敏感信息不会被没有权限的人看到,可以保证一些机密信息的安全。
提高表的逻辑独立性
视图可以屏蔽原有表结构变化带来的影响。如果原有表中增加或删除未被引用的列,对视图不会造成影响。同样,如果修改了表中的某些列可以使用视图来解决这些列带来的影响。
3.2 创建视图的语法
创建视图是通过CREATE VIEW语句完成的,语法形式如下:
CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];
其中,ALGORITHM是可选参数,表示视图选择的算法;视图名表示要创建的视图的名称;属性清单是可选参数,其指定了视图中各个属性的名字,默认情况下与SELECT语句中查询的属性相同;SELECT语句参数是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中;WITH CHECK OPTION是可选参数,表示更新视图时要保证在该视图的权限范围内。
ALGORITHM包含三个选型UNDEFINED、MERGE和TEMPTABLE。其中,UNDEFINED选项表示MySQL将自动选择所要使用的算法;MERGE选项表示将使用视图的语句和视图定义结合起来,使得视图定义的某一部分取代语句的对应部分;TEMPTABLE选项表示将视图的结果存入临时表中,然后使用临时表执行语句。
CASCADED是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL表示更新视图时,要满足该视图本身定义的条件即可。
TIPS:使用CREATE VIEW创建视图时,最好加上WITH CHECK OPTION 参数,而且最好加上CASCADED参数。这样,从视图上派生出来新视图后,更新新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性。
创建视图时,需要具有CREATE VIEW权限。同时应具有查询涉及的列的SELECT权限。
可在一个表上创建视图,也可以在多个表上创建视图。
3.3 查看视图
查看视图必须要有SHOW VIEW的权限。查看视图的方法包括:DESCRIBE语句、SHOW TABLE STATUS语句、SHOW CREATE VIEW语句和information_schema数据库下的views表等。
查看视图基本信息
查看视图基本信息可使用如下两个语句:
DESCRIBE 视图名;
SHOW TABLE STATUS LIKE ‘视图名’;
查看视图的详细信息
查看视图的详细信息可以使用下面的两种语法:
SHOW CREATE VIEW 视图名;
SELECT * FROM information_schema.views;
其中,*表示查询所有的列的信息;information_schema.views表示information_schema数据库下面的views表。通常情况下使用SHOW CREATE VIEW查看视图的详细信息。
3.4 修改视图
修改视图是指修改数据库中已经存在的表的定义。当基本表的字段发生变化时,可以通过修改视图来保持视图和基本表之间的一致。MySQL通过ALTER语句和CREATE OR REPLACE VIEW语句来修改视图。
CREATE OR REPLACE VIEW语句修改视图
在视图已经存在的情况下,对视图进行修改;视图不存在时可以创建视图。语法如下:
CREATE OR REPLACE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION]
此处的所有参数均和创建视图时的参数的含义完全一致。
ALTER语句修改视图
ALTER语句修改视图的语法如下:
ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION]
同上,这里所有的参数都和创建视图时的参数一样。
3.5 更新视图
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,表中没有数据。通过视图更新时,都是转换到基本表中来更新。更新视图时,只能更新权限范围内的数据。超出了范围就不能更新。
和基本表通过insert、update和delete等语句更新数据相同,只不过将表更换成了视图。
3.6 删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL中通过DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。
对需要删除的视图使用DROP VIEW语句进行删除,基本形式如下:
DROP VIEW [IF EXISTS] 视图名列表 [RESTRICT|CASCADED]
其中,IF EXISTS参数指判断视图的存在,如果存在则执行,不存在则不执行;“视图名列表”参数表示要删除的视图的名称的列表,各个视图名称之间用逗号分隔。