视图

什么是视图?

1:在数据库中保存SELECT查询一张或多张表结果的一张虚拟表

2:视图中不存放数据,它只是对原始表的引用。

   

为什么需要视图?

1:使数据安全,不同的权限看不同的数据

2:符合业务逻辑,容易理解

   

视图的用途?

1:筛选表中的行

2:防止未经许可的用户访问到敏感的数据

3:将多个物理数据表抽象为一个逻辑数据表

   

视图带来的好处?

1:对最终用户的好处:

   a)可以修改列名显示,结果好理解

   b)获得数据更容易,省略了多表查询的麻烦

2:对开发人员的好处:

   a)限制数据检索更容易。便于对想要隐藏列的保护

   b)维护更方便:调试视图比调试查询更容易

   

使用视图的注意事项:

1:每个视图中可以使用多张表

2:与查询相似,一个视图可以嵌套另一个视图,但最好不超3

3:对视图进行添加删除修改操作直接引用表中的数据(但是一般这样的修改

会会受到数据库的很多限制,所以开发中一般还是在原始表中修改数据,视图仅用作查询)

4:当视图数据来自多个表时,不允许添加和删除数据

5: 视图来自一张表时,可以修改该视图,相当于修改该表。

   

使用视图的语法:

一:使用SQL语句创建视图

    CREATE VIEW view_xxx AS <SELECT语句>;

二:使用SQL语句删除视图

    DROP VIEW IF EXISTS view_xxx;

三:使用SQL语句查看视图数据

    SELECT `name`,`no`,`score` FROM view_xxx;

-----------------------------------------------------

   

视图在mysql中的内部管理机制:

MySQL安装成功之后,系统会自动创建information数据库,里面有一张包含所有视图信息的表叫做views,因此可以从这里查看到所有视图的信息:

USE information_schema;

SELECT * FROM views\G;

视图的记录都保存在information_schema数据库中的一个叫views的表中。具体某个视图的定义代码以及属于哪个数据库等信息可以从里面看到理解视图的两种工作机制:

语句:select * from teams

   

总结知识点小结

 

  1. 视图的确认过程

teams也可以是表名。由于表与视图的物理机制不同。视图本身是不存储内容的。所以,在使用sql的时候,mysql是怎么知道teams是一个视图还是表。是因为有一个查看目录的例程在做这件事。

 

2.mysql对处理视图的两种方法:替代方式和具体化方式。

 

A:替换方式:

视图名直接使用视图的公式替换掉了。针对上面视图teamsmysql会使用该视图的公式进行替换,视图公式合并到了select中。结果就是变成了如下sql语句:

select * from (SELECT  DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。也就是最后提交给mysql处理该sql语句。 

 

B:具体化方式:

mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中。之后,外面的select语句就调用了这些中间结果(临时表)看起来都是要得到结果,形式上有区别,好像没体会到本质上的区别。

 

两种方式又有什么样的不同呢?

替换方式,将视图公式替换后,当成一个整体sql进行处理了。具体化方式,先处理视图结果,后处理外面的查询需求。替换方式可以总结为,先准备,后执行。具体化方式总结理解为,分开处理。哪种方式好?不知道。ysql会自己确定使用哪种方式进行处理的。自己在定义视图的时候也可以指定使用何种方式。像这样使用:

 

CREATE ALGORITHM=merge VIEW teams as SELECT  DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result

ALGORITHM有三个参数分别是:mergeTEMPTABLEUNDEFINED

 

mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:

因为临时表中的数据不可更新。所以,如果使用参数是TEMPTABLE,无法进行更新。当你的参数定义是UNDEFINED(没有定义ALGORITHM参数)mysql更倾向于选择合并方式。是因为它更加有效。

  

posted @ 2017-12-18 20:14  老人与JAVA  阅读(232)  评论(0编辑  收藏  举报