最新文章
- MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方
- Vue学习笔记(10) ——Vue组件中的data和methods
- Vue学习笔记(9) ——Vue组件创建的几种方式
- Vue学习笔记(8) ——Vue实例的生命周期
- Vue学习笔记(7) —— 过滤器 filter的基本使用
- Vue学习笔记(6) ——v-if指令和v-show指令
- Vue学习笔记(5) —— v-for指令和key属性
- Vue学习笔记(5) —— Vue中样式-class样式和style样式
- Vue学习笔记(4) —— v-model指令,双向数据绑定
- Vue学习笔记(3) —— Vue事件修饰符
关注我


MySQL中的视图
- 分类:MySQL技术
- 时间:2017-11-20
- 共670人围观
视图 -> 叫 view
一、视图是干什么的
一张表多行多列,我不想看多行多列,我们将三行三列取出来 -> 形成一个结果集,拿着这个结果集,我们可以再次查询,结果集可以当作一张表,那么这张表就可以再次查询如果某个结果集,我经常要对它进行查询,挺麻烦的,每次要写,from (select ...),那么对于这个常用的结果集,我能不能把它存起来呢?
select goods_id,goods_name,(market_price-shop_price) as sheng from goods;
将上面的sql得到的结果集,存下来,以便我们下次从这个结果集中查询我们想要的数据,如何将这个结果集存储下来呢?
建视图sgoods
create view 视图名字 as (select语句...)
create view sgoods as select goods_id,goods_name,(market_price-shop_price) as sheng from goods; select * from sgoods; # 这个sgoods表的内容,就是上面select的结果集
二、视图的概念
view 又被成为虚拟表,view是sql语句的查询结果
也可以说, 它是表到结果的映射
一个sql的查询结果,我用 view 存起来
下次你查这个view,就相当于这个sql发挥作用了
三、view有什么好处呢? 要view有什么用
1) 权限控制时可以用
比如,某几个列,允许用户查询,其他列不允许查询
可以通过视图,开放其中一列或几列,起到权限控制的作用
如,我们只能让用户查询到goods表的goods_id,goods_name,shop_price
create view s2goods as select goods_id,goods_name,shop_price from goods; select * from s2goods; # 任你怎么查询s2goods表也无法得到market_price
2): 简化复杂的查询
select 嵌套 select 查询 select * from (select....)
我们可以先将内层select语句的查询结果转为视图,在通过视图查询我们具体想要的内容
例: 查询每个栏目下商品的平均价格,并按照平均价格排序,查出前三高的商品的栏目
我们先查出每个栏目下商品的平均价格
select cat_id, avg(shop_price) as pj from goods group by cat_id;
在从上面sql 得到的结果集中 desc 排序,取前三行即可通过view 我们可以简化上面的sql
select * from (select cat_id,avg(shop_price) as pj from goods group by cat_id) as tmp order by pj desc limit 0,3;
通过view 我们可以简化上面的sql
create view pingjun as select cat_id,avg(shop_price) as pj from goods group by cat_id; select * from pingjun order by pj desc limit 0,3;
四、view是什么
view 就是你储存好的一条sql的查询结果
select * from pingjun order by pj desc limit 0,3;
这条sql的查询的pingjun这个表,我们能看出来pingjun是个表还是个视图吗? 不能,对于人的操作而言,看起就是一张透明的表
我们
show tables;
可以看到我们的视图,也是存在的,我们都区分不出来它是表还是视图
五、视图可以更改,删除吗? *(重点)
我们测试一下,新建一个vuser视图
create view vuser as select uid,name from user; select * from vuser;
1. 将user表中的数据改一下
update user set name='Jane' where uid=4;
2. 查询vuser视图表中的数据,看数据是否有变化
select * from vuser;
我们可以看出,vuser的内容随着user表的更改而变化了,因为视图,就是物理表经过某个运算(select)得到的一个投影,真实的表都变化了,这个投影肯定也会随之改变
3. 我们修改vuser 视图表中的数据 会发生什么?
update vuser set name='who' where uid=4;
我们看到,user表和vuser表的数据都改成功了
4. 我们在上面有个pingjun视图表
select * from pingjun;
那pingjun表中的pj列,能修改成功吗?
update pingjun set pj=80 where cat_id=15;
报错: pingjun表的pj字段不能被更改
我们将一个栏目下平均价格给改了,那这个栏目下那么多商品,这些商品的价格又该是多少呢?
如果视图的每一行,是与物理表一一对应的,它俩有且只有一个相互对应的字段,就像数学上的可逆函数,如果是这样就可以相互影响修改;如果view某一行,是由物理表经过计算得到的结果,view则是不能更改的,因为它映射到物理表上有多行,不知道更改哪里
上一篇:MySQL中的 union 查询
下一篇:MySQL 字符集与乱码问题