zoukankan      html  css  js  c++  java
  • MySQL 视图

    一. 视图概述

    视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
    对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
    视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列:

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:

    二.视图好处

    1、方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

    视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。

    如果要获取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了。尤其是当连接(left join等)多张表时(比如同时连接7张表),使用视图就能更简便。

    2、 对数据库重构,却不影响程序的运行。

    假如因为某种需求,需要将user拆分成表usera和表userb,该两张表的结构如下:

    测试表:usera有id,name,age字段
    测试表:userb有id,name,sex字段

    删掉原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都是唯一的。此时使用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的数据,其他的数据就获取不了了。

    三、总结

    视图不能提高查询速度,只能简化查询

  • 相关阅读:
    SpringMVC自动封装List对象 —— 自定义参数解析器
    fetch封装
    基于jQuery实现简单的js模块化
    CSS实现树形结构 + js加载数据
    java多线程
    JS中AOP的实现和运用
    移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象
    chart.js使用常见问题
    用PHP和Ajax进行前后台数据交互——以用户登录为例
    用JS添加和删除class类名
  • 原文地址:https://www.cnblogs.com/banma/p/7447510.html
Copyright © 2011-2022 走看看