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

创建视图语法

示例一:
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;

更改视图

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;
上一篇下一篇

猜你喜欢

热点阅读