视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
视图简介
视图的含义
视图是一种虚拟的表。视图从数据库中的一个或多个表导出来的表。视图还可以从已经存在的视图的基础上定义。数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据时依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
视图的作用
视图是在原有的表或者视图的基础上重新定义的虚拟表,这可以从原有的表上选取对用户有用的信息。那些对用户没有用,或者用户没有权限了解的信息,都可以直接屏蔽掉。这样做即使应用简单化,也保证了系统的安全。视图起着类似于筛选的作用。视图的作用归纳于如下几点:
1.使操作简单化
视图需要达到的目的就是所见即所需,也就是说,从视图看到的信息就是所需要了解的信息。视图可以简化对数据的操作。例如,可以为经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件。这样可以很大程度上方便用户的操作。
2.增加数据的安全性
通过视图,用户只能查询指定的数据。指定数据以外的信息,用户根本接触不到。数据库授权命令可以限制用户的操作权限,但不能限制到特定行和列上。使用视图后,可以简单方便的将用户的权限限制到特定的行和列上。这样可以保证敏感信息不会被没有权限的人看到,可以保证一些机密信息的安全。
3.提高表的逻辑独立性
视图可以屏蔽原有表结构变化带来的影响。例如,原有表增加列和删除未被引用的列。对视图不会造成影响。同样,如果修改了表中的某些列,可以同修改视图来解决这些列带来的影响。
创建视图
创建视图是指在已存在的数据库表上建立视图。视图可以建立在一张表上,也可以建立在多张表上。
创建视图的语法形式
MySQL中,创建视图是通过SQL语句create view实现的。其语法形式如下:
create [algorithm={undefined|merge|temptable}]
view 视图名 [(属性清单)]
as select 语句
[with [cascaded|local]check option];
“algorithm”包含3个选项undefined和merge和temptable,其中,“undefined”选项表示MySQL将自动选择所要使用的算法。“merge”选项表示将使用视图的语句与表定义合并起来,使得视图定义的某一部分取代语句的对应部分,“temptable”选项表示将视图的结果存入临时表,然后使用临时表执行语句。
cascaded是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值,“local”表示更新视图时要满足该视图本身的定义的条件即可。
MySQL 视图的定义有一些限制,例如,在 FROM 关键字后面不能包含子查询,这和其他数 据库是不同的,如果视图是从其他数据库迁移过来的,那么可能需要因此做一些改动,可以 将子查询的内容先定义成一个视图,然后对该视图再创建视图就可以实现类似的功能了
在单表上创建视图
MySQL中可以在单个表上创建视图。下面在department表上创建一个简单的视图。视图名称为department_view1.如图:
在多表上创建视图
MySQL中也可以在两个或两个以上的表上创建视图,也是使用create view语句实现的。下面在department表和work表上创建一个名为work_view1的视图,如图:
查看视图
查看视图是指查看数据库中已存在的视图的定义。查看视图必须要有show view的权限,mysql数据库中的user表中保存着这个信息。查看视图的方法包括describe语句,show table status语句、show create view语句和查询information_schema数据库下的views表等
DESCRIBE语句查看视图基本信息
视图也是一种表。只是这张表比较特殊,是一张虚拟的表。因此,同样可以使用DESCRIBE语句可以用来查看视图的基本定义。基本形式如下;
DESCRIBE 视图名
show table status语句查看视图基本信息
MySQL中,可以使用show table status语句来查看视图的信息。其语法形式如下:
show table status LIKE '视图名';
其中,“LIKE”表示后面匹配的的是字符串;“视图名”参数指要查看的视图的名称,需要用单引号引起了
show create view 语句查看视图详细信息
MySQL中,show create view 语句可以查看视图的详细定义。其语法形式如下:
show create view视图名
在views表中查看视图详细信息
MySQL中,所有视图的定义都存在information_schema数据库下的views表中。查询views表,可以查看数据库中所有视图的详细信息。查询的语句如下:
SELECT * FROM information_schema.views;
其中,“*”表示查询所有列的信息,information_schema.views表示information_schema数据库下的views表。
修改视图
修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图与基本表之间一直。MySQL中通过create or replace view 语句和alter语句来修改视图。
create or replace view 语句修改视图
MySQL中,create or replace view 语句可以用来修改语句。该语句的使用非常灵活,在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。其基本语法形式如下:
create or replace [algorithm|={undefined|merge|temptable}]
view 视图名 [(属性清单)]
as select 语句
[with [cascaded| local] check option];
alter语句修改视图
在MySQL中,alter语句可以修改表的定义,可以创建索引。不仅如此,alter语句还可以用来修改视图。其基本语法格式如下:
alter [algorithm|={undefined|merge|temptable}]
view 视图名 [(属性清单)]
as select 语句
[with [cascaded| local] check option];
更新视图
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟的表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
更新:
注意:并不是所有的视图都可以更新的。以下这几种情况是不能更新视图的。
1.视图中包含SUM(),COUNT(),MAX(),MIN()等函数,下面创建视图work_view4的代码如图:
因为该视图包含COUNT(),所以该视图是不能更新的
2.视图中包含UNION,UNION ALL,DISTINCt,GROUP BY ,HAVING等关键字,下面创建视图work_view5的代码如图:
因为该视图包含GROUP BY关键字,所以该视图是不能更新的
3.常量视图,下面创建视图work_view6的代码如图:
因为该视图的name字段是个字符串常量“Aric”,所以该视图也是不能更新的,更新时会出现系统报错。
4.视图中的select中包含子查询,看图:
该视图包含了子查询,因此也是不能更新的。
5.由不可更新的视图导出的视图。
因为work_view7是不可更新的视图,所以work_view8也不可以更新,更新时,会出现系统报错。
6.创建视图时,ALGORITHM为TEMPTABLE类型
因为该视图的ALGORITHM为TEMPTABLE类型,所以不可以更新视图,TEMPTABLE类型是临时表类型。系统默认临时表是不能更新的。
7.视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中包含的name字段没有默认值,但是视图中不包含该字段,那么这个视图是不能更新的。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有null值插入。数据库系统是不会允许这样的情况出现的,数据库系统将会阻止这个视图更新。
注意:视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。
删除视图
删除视图是指删除数据中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL中,使用DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。
对需要删除的视图,使用DROP VIEW 语句进行删除,基本形式如下:
DROP VIEW [IF EXISTS] 视图名列表[ RESTRICT|CASCADE]
查看用户有没有DROP权限,如图:
删除一个视图:
删除多个视图: