如果某个结果集 , 我经常要对它进行查询 , 挺麻烦的 , 每次要写一条sql语句,那么对于这个常用的结果集 , 我能不能把它存起来呢 ?例如:
- select goods_id,goods_name,(market_price-shop_price) as sheng from goods;
将上面的 sql 得到的结果集 , 存下来 , 以便我们下次从这个结果集中查询我们想要的数据;如何将这个结果集存储下来呢 ?
1、建视图
以下sql语句中vgoods 表的内容 , 就是上面 select 的结果集;
- create view vgoods as select goods_id,goods_name,(market_price-shop_price) as sheng from goods;
2、 视图的概念
view 又被成为虚拟表 ,view 是 sql 语句的查询结果;也可以说 它是表到结果的映射一个 sql 的查询结果 , 我用 view 存起来,下次你查这个 view, 就相当于这个 sql 发挥作用了;
3、视图有什么好处呢 ?
(1):权限控制时可以用
比如 , 某几个列 , 允许用户查询 , 其他列不允许查询,可以通过视图 , 开放其中一列或几列 , 起到权限控制的作用;例如:我们只能让规定用户查询到 goods 表的 goods_id,goods_name,shop_price;
- create view v2goods as select goods_id, goods_name,shop_price from goods;
- select * from v2goods;
这样权限控制以后,任你怎么查询 v2goods 表也无法得到 market_price这个列;
(2):简化复杂的查询
我们可以先将内层 select 语句的查询结果转为视图,在通过视图查询我们具体想要的内容;例如:查询goods表每个栏目下商品的平均价格 , 并按照平均价格排序 , 查出前三高的商品的栏目
1) 我们先查出每个栏目下商品的平均价格
- select cat_id,avg(shop_price) as pj from goods group by cat_id;
2) 在从上面 sql 得到的结果集中 desc 排序 , 取前三行即可
- 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;
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;
4、视图是什么?
view 就是你储存好的一条 sql 的查询结果;对于我们来说,视图就是一张透明的表,我们并不能去看这是视图还是表;用show tables;可以看到我们的视图 , 也是存在的 , 我们都区分不出来它是表还是视图;
5、视图可以更改 ,可以 删除吗?
视图可以删除,但是不能修改;因为视图是sql结果集,它的数据都是来源于物理表(主表)的,如果物理表发生了变化,视图表也会发生变化;但是你却不能修改视图表从而来影响物理表;
视图SQL管理语句
1、查看所有视图
除了显示视图,连表也会显示出来;这命令其实就是显示所有表的命令;视图它本身就相当于是表;
show tables;
2.、查看视图结构
desc 视图名
3、查看建视图过程
show create view 视图名
4、删除视图
drop view 视图名
7.、查看库中的表/视图信息
如果表信息太多 , 看不清楚 可以加上 \G 竖着显示;
show table status;
或
show table status \G;
8、查看某张表是否是视图
如果是视图 : Comment: VIEW
如果不是视图 : Comment
show table status where name='表名';
或
show table status where name='表名' \G;