MySQL数据库实战教程-70-视图( 二 )
2.创建视图的时候,该视图的名字如果与已经存在表重名的话,那么会报错,不允许创建 。视图就是一种特殊的表
3.创建视图的时候,可以这样使用CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION),可以定义视图表的结构 。
4.在phpmyadmin中 。左边的表列表中将视图与表列在了一起 。只有通过右侧的状态"View:teams"可以知道该表是视图表 。
视图在mysql中的内部管理机制:
视图的记录都保存在information_schema数据库中的一个叫views的表中 。具体某个视图的定义代码以及属于哪个数据库等信息可以从里面看到理解视图的两种工作机制:
语句:select * from teams
针对上面语句,总结几个知识点
1.确认是视图的过程:teams也可以是表名 。由于表与视图的物理机制不同 。视图本身是不存储内容的 。所以,在使用sql的
时候,mysql是怎么知道teams是一个视图还是表 。是因为有一个查看目录的例程在做这件事 。
2.mysql对处理视图的两种方法:替代方式和具体化方式 。
替换方式理解,视图名直接使用视图的公式替换掉了 。针对上面视图teams,mysql会使用该视图的公式进行替换,视图公式合并到了select中 。结果就是变成了如下sql语句:
select * from (SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result) 。也就是最后提交给mysql处理该sql语句 。
具体化方式理解,mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中 。之后,外面的select语句就调
用了这些中间结果(临时表) 。
看起来都是要得到结果,形式上有区别,好像没体会到本质上的区别 。两种方式又有什么样的不同呢?
替换方式,将视图公式替换后,当成一个整体sql进行处理了 。具体化方式,先处理视图结果,后处理外面的查询需求 。
替换方式可以总结为,先准备,后执行 。
具体化方式总结理解为,分开处理 。
哪种方式好?不知道 。mysql会自己确定使用哪种方式进行处理的 。自己在定义视图的时候也可以指定使用何种方式 。像这样
使用:
CREATE ALGORITHM=merge VIEW teams as SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
ALGORITHM有三个参数分别是:merge、TEMPTABLE、UNDEFINED
看mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:
因为临时表中的数据不可更新 。所以,如果使用参数是TEMPTABLE,无法进行更新 。
当你的参数定义是UNDEFINED(没有定义ALGORITHM参数) 。mysql更倾向于选择合并方式 。是因为它更加有效 。
[转]mysql视图学习总结
标签:
- MySQL安装流程达内科技分享系列达内web视频
- 17-vue零基础到实战-注册和登录页面「渡一教育」
- MySQL教程-10-MySQL的常用命令
- MySQL数据库实战教程-64-事务四大特性
- 有关数据库