09-视图
2019-01-06 本文已影响0人
喝酸奶要舔盖__
视图基本概念
- 什么是视图?
- 视图仅仅是表的结构, 没有表的数据
- 视图的结构和数据是建立在表的基础上的
- 视图中保存了一张表或者多张表的部分或者所有数据
- 视图的作用
+ 例如 表中有id,name,age,gender,score, 我们需要查询id,name,gender
+ select id,name,gender from stu;
+ 如果在表的基础上创建了一个包含id,name,gender的视图
+ select * from stu_view;
- 视图可以用来隐藏表的结构
+ 表中有id,name,age,gender,score, 视图中有id,name,gender
+ 那么外界在使用视图的时候就不知道表中还有age和score
创建视图语法
create view 视图名称 as select 语句;
示例一:
select name,city from stu;
create view stu_view as select name,city from stu;
select * from stu_view;
注意点:
视图仅仅是表的结构, 没有表的数据
视图是建立在表的基础上的, 如果修改视图中的数据本质上是修改了表中的数据
#由于视图不保存数据, 本质上数据是插入到了表中
insert into stu_view values('yyyy', '武汉');
#由于视图不保存数据, 本质上修改的是表中的数据
update stu_view set city='杭州' where name='ww';
#由于视图不保存数据, 本质上删除的是表中的数据
delete from stu_view where name='ww';
示例二:
在多表查询的时候, 如果需要显示重复字段, 必须在字段名称前面加上表名
select * from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
select stuinfo.stuid, name, score from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
create view studes_view as select stuinfo.stuid, name, score from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
更改视图
alter view 视图名称 as select 语句;
create view stu_view as select name,city from stu;
# 修改视图返回的结果
alter view stu_view as select name,age,city from stu;
删除视图
drop view [if exists] 视图名;
drop view if exists stu_view;
视图算法(了解)
select * from (select * from stu order by score desc) as t group by city;
#将子查询封装到视图中去
create view order_view as select * from stu order by score desc;
#用视图替代子查询
select * from order_view group by city; #结果出现了误差
视图算法
- merge: 合并算法, 将视图的语句和外层的语句合并之后再执行
- temptable: 临时表算法, 将视图生成一个临时表, 再执行外层的语句
- undefined: 未定义, 由MySQL自己决定使用如上的哪一种算法, 默认就是undefined
+ 由于合并算法的效率比临时表算法效率高, 所以MySQL一般会选择合并算法
- 如上案例中导致数据混乱的原因就是因为默认使用了合并算法
#将子查询封装到视图中去
# algorithm=temptable指定视图的算法
create algorithm=temptable view order_view as select * from stu order by score desc;
#用视图替代子查询
select * from order_view group by city;