zoukankan      html  css  js  c++  java
  • 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. 让数据更加清晰想要什么样的数据,就创建什么样的视图。经过以上三条作用的解析,这条作用应该很容易理解了。
     
     
     
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/XiaKang/p/13198038.html
Copyright © 2011-2022 走看看