数据库(七)视图

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

7.1视图概述

  视图是由数据库中的一个表或者多个表导出的虚拟表,方便用户对数据的操作,其内容由查询定义。同真实的表一样,视图包括一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时候,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

  视图是存储在数据库中的SQL语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据;另一个原因是可使得复杂的查询易于理解和使用。

  对其中引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。下面将视图的作用归纳为以下几点:
  1.简单性:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

  2.安全性:视图的安全性可以防止未授权用户查看特定的行或列,使有权限用户只能看到表中特定行的方法如下:(1)在表中增加一个标志用户名的列。(2)建立视图,使用户只能看到标有自己用户名的行。(3)把视图授权给其他用户。

  3.逻辑数据独立性:视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,程序一定是建立在表上的。有了视图之后,程序可以建立在视图上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立:(1)如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动。(2)如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。(3)如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动。(4)如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动。

7.2创建视图

create view
user_view(a_id,a_user,a_password)
as select id,user,password
from tb_user;

创建视图的注意事项:
(1).运行创建视图的语句需要用户具有创建视图的权限,若加了(or replace)时,还需要用户具有删除视图的权限,
(2)select语句不能包含from子句中的子查询
(3)select语句不能引用系统或用户变量。
(4)select语句不能引用预处理语句参数。
(5)在存储子程序内,定义不能引用子程序参数或局部变量。
(6)在定义中引用的表或视图必须存在。但是在创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义中是否存在这类问题,可使用check table语句。
(7)在定义中不能引用temporary表,不能创建temporary视图。
(8)在视图定义中命名的表必须已经存在。
(9)不能将触发程序与视图关联在一起。
(10)在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。

7.3视图操作
7.3.1查看视图

desc user_view;
show table status like 'user_view';
show create view user_view;--show create view 语句可以查看视图的详细定义

7.3.2修改视图

//create or replace view语句可以用来修改视图,在视图已经存在的情况下,对视图进行修改;
//视图不存在时,可以创建视图
create or replace 
view user_view(a_id,a_user)
as select id,user from tb_user;
alter view book_view1(a_id)
as select id
from tb_book
with check option;
//alter view语句改变了视图的定义,包括被索引视图,但不影响所依赖的存储过程或触发器。该语句与create view语句
//有着同样的限制,如果删除并重建了一个视图,就必须重新为它分配权限。

7.3.3更新视图

update user_view set a_user='xiaochen' where a_id=1;
//对视图的更新其实就是对基本表的更新

更新视图的限制:
(1)视图中包含count(),sum(),max()和min()等函数
(2)视图中包含union,union all,distinct,group by和having等关键字
(3)常量视图
(4)视图中的select 中包含子查询
(5)由不可更新的视图导出的视图
(6)创建视图时,algorithm为temptablel类型

7.3.4删除视图
删除视图是指删除数据库中已存在的视图。删除视图时候,只能删除视图的定义,不会删除数据。

drop view if exists book_view1;

猜你喜欢

转载自blog.csdn.net/heloiselt/article/details/80507495