视图
1:在数据库中保存SELECT查询一张或多张表结果的一张虚拟表
3:对视图进行添加删除修改操作直接引用表中的数据(但是一般这样的修改
会会受到数据库的很多限制,所以开发中一般还是在原始表中修改数据,视图仅用作查询)
CREATE VIEW view_xxx AS <SELECT语句>;
SELECT `name`,`no`,`score` FROM view_xxx;
-----------------------------------------------------
MySQL安装成功之后,系统会自动创建information数据库,里面有一张包含所有视图信息的表叫做views,因此可以从这里查看到所有视图的信息:
视图的记录都保存在information_schema数据库中的一个叫views的表中。具体某个视图的定义代码以及属于哪个数据库等信息可以从里面看到理解视图的两种工作机制:
teams也可以是表名。由于表与视图的物理机制不同。视图本身是不存储内容的。所以,在使用sql的时候,mysql是怎么知道teams是一个视图还是表。是因为有一个查看目录的例程在做这件事。
视图名直接使用视图的公式替换掉了。针对上面视图teams,mysql会使用该视图的公式进行替换,视图公式合并到了select中。结果就是变成了如下sql语句:
select * from (SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。也就是最后提交给mysql处理该sql语句。
mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中。之后,外面的select语句就调用了这些中间结果(临时表)。看起来都是要得到结果,形式上有区别,好像没体会到本质上的区别。
替换方式,将视图公式替换后,当成一个整体sql进行处理了。具体化方式,先处理视图结果,后处理外面的查询需求。替换方式可以总结为,先准备,后执行。具体化方式总结理解为,分开处理。哪种方式好?不知道。ysql会自己确定使用哪种方式进行处理的。自己在定义视图的时候也可以指定使用何种方式。像这样使用:
CREATE ALGORITHM=merge VIEW teams as SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
ALGORITHM有三个参数分别是:merge、TEMPTABLE、UNDEFINED
看mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:
因为临时表中的数据不可更新。所以,如果使用参数是TEMPTABLE,无法进行更新。当你的参数定义是UNDEFINED(没有定义ALGORITHM参数)。mysql更倾向于选择合并方式。是因为它更加有效。