MySQL视图

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

视图的作用
  视图在原有的表或者视图的基础上重新定义的虚拟表,从原有的表上选取对用户有用的信息。那些对用户没有用或者用户没有权限了解的信息,都可以直接屏蔽掉。视图起着类似于筛选的作用。视图的作用归纳于如下几点:

  1.使操作简单化

  视图需要达到的目的就是所见即所需,也就是说,从视图看到的信息就是所需要了解的信息。视图可以简化对数据的操作。例如,可以为经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件。这样可以很大程度上方便用户的操作。

  2.增加数据的安全性

  通过视图,用户只能查询指定的数据。指定数据以外的信息,用户根本接触不到。数据库授权命令可以限制用户的操作权限,但不能限制到特定行和列上。使用视图后,可以简单方便的将用户的权限限制到特定的行和列上。这样可以保证敏感信息不会被没有权限的人看到,可以保证一些机密信息的安全。

  3.提高表的逻辑独立性

  视图可以屏蔽原有表结构变化带来的影响。例如,原有表增加列和删除未被引用的列。对视图不会造成影响。同样,如果修改了表中的某些列,可以同修改视图来解决这些列带来的影响。

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

创建视图的语法形式
  MySQL中,创建视图是通过SQL语句create view实现的。其语法形式如下:

    create  [algorithm={undefined|merge|temptable}]   view 视图名 [(属性清单)]  

    as select 语句 [with [cascaded|local]check option];

  “algorithm”包含3个选项undefinedmergetemptable,其中,“undefined”选项表示MySQL将自动选择所要使用的算法“merge”选项表示将使用视图的语句与表定义合并起来使得视图定义的某一部分取代语句的对应部分“temptable”选项表示将视图的结果存入临时表,然后使用临时表执行语句

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

//创建视图
create view stu_view(name,age,phone) as select name,age,phone from t_stu;
//创建多表示视图
create view stu_score_view(stu_id,name,score) as select t_stu.stu_id,name,score from t_stu,t_score where t_stu.stu_id=t_score.stu_id;

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

    SELECT * FROM information_schema.views;

  其中,“*”表示查询所有列的信息,information_schema.views表示information_schema数据库下的views表。

修改视图

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

  MySQL中,create or replace view 语句可以用来修改语句。该语句的使用非常灵活,在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。

 create or replace view stu_view as select name,age from  t_stu;

alter语句修改视图
  在MySQL中,alter语句可以修改表的定义,可以创建索引。不仅如此,alter语句还可以用来修改视图。其基本语法格式如下:

  alter [algorithm|={undefined|merge|temptable}]

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

  as select 语句

  [with [cascaded| local] check option];

alter view stu_view(name) as select name from t_stu;

更新视图

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

 update view stu_view name='Jack'

  并不是所有的视图都可以更新的。以下这几种情况是不能更新视图的:

      1.视图中包含SUM(),COUNT(),MAX(),MIN()等函数,(Target view is not updateable!)异常

      2.视图中包含UNION,UNION ALL,DISTINCt,GROUP BY ,HAVING等关键字

      3.常量视图

create view const_view as select 'AAAA' as name;  //常量视图

     4.视图中的select中包含子查询

create view stu_view(name) as select (select name from t_stu);

     5.由不可更新的视图导出的视图

create view stu_view as select * from const_view;

    6.创建视图时,ALGORITHM为TEMPTABLE类型,因为该视图的ALGORITHM为TEMPTABLE类型,所以不可以更新视图,TEMPTABLE类型是临时表类型。系统默认临时表是不能更新的。

    7.视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中包含的name字段没有默认值,但是视图中不包含该字段,那么这个视图是不能更新的。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有null值插入。数据库系统是不会允许这样的情况出现的,数据库系统将会阻止这个视图更新。

  注意:视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。

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

  对需要删除的视图,使用DROP VIEW 语句进行删除,基本形式如下:

 drop view stu_view if exists stu_view;
posted on 2018-10-25 17:40  溪水静幽  阅读(151)  评论(0)    收藏  举报