2017-11-20MySQL中的视图

您现在的位置是: 首页 > MySQL技术 > MySQL中的视图

394次阅读

视图 -> 叫 view

一、视图是干什么的


一张表多行多列,我不想看多行多列,我们将三行三列取出来 -> 形成一个结果集,拿着这个结果集,我们可以再次查询,结果集可以当作一张表,那么这张表就可以再次查询如果某个结果集,我经常要对它进行查询,挺麻烦的,每次要写,from (select ...),那么对于这个常用的结果集,我能不能把它存起来呢?

select goods_id,goods_name,(market_price-shop_price) as sheng from goods;

将上面的sql得到的结果集,存下来,以便我们下次从这个结果集中查询我们想要的数据,如何将这个结果集存储下来呢?

建视图

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 又被成为虚拟表,iew是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中的视图