MySQL-视图

1.概念:

  1. 视图是 MySQL 在 5.0.1 版本中加入的功能。它可以理解为一个虚表。
  2. 之所以被称为虚表,是因为它只是存储了一个结构,并不存储真实的数据。它的数据是在查询过程中动态生成的。
  3. 视图并不是真的优化
2.创建视图:视图 只是存储了一个结构,并不存储真实的数据。
--CRUD
select id,user_name,email from `user`;
--创建视图 
create VIEW user_view as select id,user_name,email from `user`;
 
3.查看视图:和表一样,我们可以用 desc 视图名;来查看视图的每一列
desc user_view; 
--查看创建的视图语法 
show create view user_view; 
--查询视图内容
select * from user_view;

>注意:视图查询的数据实则来自与源数据中的内容,而它本质是一个存储了一个结构,并不是存储真实的数据。

>比如:如同PHP中的一个查询方法的封装
 
4.视图优点:
  1. 第一个显著优点就是它简化了操作。此时我们完全不用关心视图是怎么处理数据的,我们只需要知道如何使用这个结果集即可,视图相当于一个中间层。
  2. 第二个显著优点就是它更加安全。比如我们可以让用户有权去访问某个视图,但是不能访问原表,这样就可以起到保护原表中某些数据的作用。
  3. 我们之后会接触到管理权限,权限是无法细致到某一个列的,通过视图,则很容易实现。
  4. 第三个显著优点就是降低耦合。假如我们以后要修改原表的结构,那么我们可以通过修改视图的定义即可,而不用修改应用程序,对访问者是不会造成影响
    的,一般来说,这样代价会更小。

5.视图缺点:

  1. 表结构修改则需要手动修改视图
  2. 视图并不能对查询优化,因此在处理大数据的时候,甚至会对性能有些影响。

6.视图IUD:表是可以更新数据的,这里的更新,指的是”增删改”,但是对于视图来说不一定。

update `user` set email = '247301260@qq.com' where id = 1; select * from user_view;
--删除视图
DROP VIEW user_view_2;
以下是视图不可更新的情况
  1. 包含聚合函数、distinct、group by、having、union、union all。
  2. 常量视图。
  3. select 包含子查询。
  4. 包含连接操作。
  5. from 一个不能更新的视图。
  6. where 子句的子查询引用了 from 子句中的表。
7.视图应用&好处
  1. 提高了重用性,就像一个函数
    --如果要频繁获取user的name和goods的name。就应该使用以下sql语言。
    --示例:
    select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id; 
    --但有了视图就不一样了,创建视图other。
    --示例:
    create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id; 
    --创建好视图后,就可以这样获取user的name和goods的name。
    --示例: 
    select * from other; 
    --以上sql语句,就能获取user的name和goods的name了。
  2. 对数据库重构,却不影响程序的运行
    --假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下 
    --测试表:usera有id,name,age字段
    --测试表:userb有id,name,sex字段 
    --这时如果php端使用sql语句:
    select * from user;
    --那就会提示该表不存在,这时该如何解决呢。
    --解决方案:创建视图。
    --以下sql语句创建视图: 
    create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name; 
    --以上假设name都是唯一的。
    --此时php端使用sql语句: 
    select * from user;
    --就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。
  3. 提高了安全性能。可以对不同的用户
    --设定不同的视图。例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图。
    --示例 如下:
    create view other as select a.name, a.age from user as a; 
    --这样的话,使用sql语句:
    select * from other; 
    --最多就只能获取name和age的数据,其他的数据就获取不了了。
  4. 让数据更加清晰想要什么样的数据,就创建什么样的视图。经过以上三条作用的解析,这条作用应该很容易理解了。
 
 
 
posted @ 2020-06-27 13:34  夏导  阅读(155)  评论(0编辑  收藏  举报