数据库相关概念系列--2. 数据库视图(mysql为例)

数据库视图



一、概念

数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。视图可以使用户操作方便,而且可以保障数据库系统的安全。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

视图是一个”虚表”,就是从已经存在的表的全部字段或数据中,挑选出来一部分字段或数据,组成另一张”并不存在的表”,这张虚表被称之”视图”。视图中的字段与对应的数据均来自已经存在的表。对于视图来说,这些已经存在的表就被称为”基表”。基表可以是一张表,也可以是多张表。视图的本质可以理解为一条查询(增删改查)语句,视图中显示的结果,就是这条查询语句查询出的结果。

不使用视图的理由:

mysql对于视图的优化并不完善,这样说并不准确,准确的说,应该是mysql对于子查询的优化不是很好,
而使用视图本身往往就意味着使用子查询,所以,如果我们必须使用视图时,
最好将视图中的sql语句尽量优化,或者说,数据量大的时候尽量避免使用视图。

注意:视图是一种”虚表”,所以不能与已经存在的表重名。

二、创建视图

在创建视图之前,请先确定当前登录的数据库用户是否拥有创建视图的权限。查询结果中,create_view_priv的值为Y,表示当前用户拥有创建视图的权利。

select create_view_priv,select_priv from mysql.user where user='root' and host='localhost';

使用以下语法创建视图:

CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
AS
SELECT查询
[WITH READ ONLY CONSTRAINT]

参数说明:

  • OR REPLACE:如果视图已经存在,则替换旧视图;
  • FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用;
  • NOFORCE:如果基表不存在,无法创建视图,该项是默认选项;
  • WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
    示例:基表未student;
    在这里插入图片描述使用如下语句创建一个视图:
CREATE VIEW VI_STUDENT AS SELECT * FROM STUDENT WHERE ID > 2;

三、使用视图

3.1 视图查询:

视图时一张虚拟表,使用select查询即可:

SELECT * FROM VU_STUDENT;

3.2 视图新增、修改、删除(视图的查询操作,可以直接在客户端使用,但是增删改却是不行的)

使用视图增加一条记录到基表STUDENT 中(会报错):

CREATE VIEW VI_STD_DLT AS INSERT INTO STUDENT VALUES (14, '范冰冰', '01', 39, 5	, '上海浦东陆家嘴1124号');

四、视图的优缺点

4.1 视图的优点

  • 使用视图,可以定制用户数据,聚焦特定的数据。
    在实际过程中,公司有不同角色的工作人员,需要一些与其有关的数据,而与他无关的数据。则可以根据这一实际情况,专门为相关人员创建一个视图,以后他在查询数据时,只需select * from view_caigou 就可以啦。

  • 使用视图,可以简化数据操作。
    在使用查询时,在很多时候我们要使用聚合函数,同时还要显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view1就可以啦,这样很方便。

  • 使用视图,基表中的数据就有了一定的安全性
    因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改和删除,可以保证数据的安全性。

  • 可以合并分离的数据,创建分区视图
    一个大公司,下属都设有很多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,将各分公司的数据合并为一个视图。

4.2 视图的缺点

  • 性能差  
    例如,sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。
  • 修改限制  
    当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

5 数据库系统视图

很多数据库中自带丰富的系统视图,以oracle为例。Oracle系统视图是提供给用户的一组只读可见的表,用于检索存储在数据库中的数据元数据,例如字段,用户,表和服务器状态信息等信息。这些系统视图帮助数据库管理员更好地维护和监控数据库。可以使用下面的语句查看所有可用的系统视图:

SELECT VIEW_NAME FROM  User_Views

User_Tab_Columns视图为例,我们可以通过以下语句检索表上的每一个字段:

SELECT  Column_Name, Data_Type,Data_Length 
FROM  User_Tab_Columns WHERE Table_Name=’Session’
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值