您的位置:首页 > 数据库 > MySQL

MYSQL-----视图

2016-06-28 12:04 513 查看
视图

视图是从一个或者多个表中导出来的表,是一种虚拟存在的表,视图就像一个窗口,通过这个窗口可以看到对自己有用的数据。使用户的操作更方便,保证了数据库的安全性。

视图依赖原来表中的数据,一但之前表中的数据发生改变,显示在视图中的数据也会发生变化。

如果需要经常从多个表中查询指定字段的信息,通过视图可以显示这些字段的数据。

1.创建视图

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

ALOGORITHM是可选参数,表示视图选择的算法。

ALOGORITHM包括三个选项:

1) undefined,表示MYSQl将自动选择要使用的算法。

2)merge。表示将使用视图的语句和视图的定义结合起来,使得视图定义的某一部分取代语句中的对应部分,

3) temptable。表示将视图的结果存入临时表,然后使用临时表执行语句。

with check option是可选参数,表示更新视图时,要在这个视图的权限范围内。

在使用create view 语句创建视图时,最好加上with check option 和cascaded,保证数据的安全性。

在创建视图时不仅要有create view 权限也应有select权限。

通过该语句来查询是否有相应权限:Select_priv Create_view_priv from mysql.user where user=’root’;

当查询的属性Select_priv和Create_view_priv的值为Y时,表示该属性有相应权限。

1)在单表上创建视图。

未指定属性列:create view view_name as select * from example0.在未指定属性列的时候,该视图包含example0表的所有列

指定属性列:create view view_name(id,name) as select id,name from example0.使用视图时,用户接触不到实际操作的表和字段,保证了数据的安全性。

2)在多表上创建视图,视图可以将多个表上的操作简洁地描述出来。

create algorithm=merge view view_name(id,name,sex,age) as select id,name,sex,age from example1,example2 where exampe1.id=example2.id with local check option;

3)查看视图

查看视图基本信息

1) decribe 或 desc 视图名;

2) show table status like ‘视图名’;该语句通常很少使用。显示的各个属性的值几乎都是NULL.

视图和普通表的区别就是视图的comment项没有信息、

查看视图所有详细信息

1) show create view 视图名;

2) 在view表中查看视图详细信息

select * from information_schema.views;

所有视图的定义都是存储在information_schema这个数据库下的view表中。也可在该表中查看视图的定义。

通常我们采用show create view 视图名;来查询详细信息。

4)修改视图

1)create or replace view

当视图不存在时,可以创建视图。不仅可以修改已存在的视图还可以创建新的视图。

create or replace algorithm=temptable view view_name(id_new,name_new) as select id,name from example3;

2)alter只能对已经存在的视图进行修改。

alter view view_name(id_new,name_new) as select id,name from example4;

5)更新视图。由于视图是一个虚拟表,因此对视图的更新都是转换到基本表上的。只能更新权限范围内的数据。

update view_name set id=1;

下面的这几种情况是不能更新视图的:

1)视图中包含 sum(),count(),max(),min();

2)视图中包含 union ,union all,distinct,group by,order by,having;

3)常量字段,比如视图某属性的值是一个常量字符串。

4)视图中的select包含子查询。

5)由不可更新的视图导出的视图。

6)创建视图时,algorithm=temptable;

7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。

8)with [cascade| local]check option.没有指明,默认为cascaded

local表示更新视图时满足视图本身定义的条件即可,

cascaded表示更新视图时要满足所有相关视图和表的条件。

总而言之,视图虽然可以更新表中的数据,但是有很多的限制。一般情况下,最好将视图作为查询的虚拟表。而不要通过视图更新数据。

因为若没有考虑到视图更新数据的限制,容易造成更新数据的失败。

6)删除视图

首先我们来查看,我们**是否有删除的权限:**select Drop_priv from mysql.user where user=’用户名’;当属性值为Y表示拥有该权限。

删除视图只会删除视图的定义,不会删除数据。

drop view [if exists] 视图名列表 [restrict| cascade];

if exists 判断该视图是否存在,存在执行,不存在就不执行。(为啥我在我的Linux数据库版本下删除一个不存在的视图只是一个警告,可能版本升级了吧)

视图名列表之间用逗号隔开。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: