一、视图概述:

1.1什么是视图?

视图是基于SQL语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。视图并不在数据库中以存储的数据值集形式存在,而是存在于实际引用的数据库表中,视图的构成可以是单表查询,多表联合查询,分组查询以及计算(表达式)查询等。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

1.2视图的优点:

(1)简化用户操作:

视图不仅可以简化用户对数据的理解,也可以简化他们的操作。

视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。

2)用户能以多种角度看待同一数据:

使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。

3)对重构数据库提供了一定程度的逻辑独立性:

视图可以使应用程序和数据库表在一定程度上独立。

数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。

4)安全性,对机密数据提供安全保护:

通过视图用户只能查询和修改他们所能见到的数据。

1.3视图的缺点:

1)性能差:

把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。

2)修改限制:

当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

1.4视图使用场景:

1) 权限控制的时候。当用户需要查询未授权的数据表且又需要部分数据表的部分列进行逻辑处理,不希望用户访问表中某些含敏感信息的列。

2)关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;

1.5视图的分类:

1)关系视图:

它属于数据库对象的一种,也就是最常见的一种关联查询;

2)内嵌视图:

它不属于任何用户,也不是对象,创建方式与普通视图完全不同,不具有可复用性,不能通过数据字典获取数据;

3)对象视图:

它是基于表对象类型的视图,特性是继承、封装等可根据需要构建对象类型封装复杂查询(官方:为了迎合对象类型而重建数据表是不实现的);

4)物化视图:

它主要用于数据库的容灾(备份),实体化的视图可存储和查询,通过DBLink连接在主数据库物化视图中复制,当主库异常备库接管实现容灾;

二、视图使用注意点:

1、修改操作时要非常非常小心,不然不经意间你已经修改了基本表里的多条数据;

2、视图中的查询语句性能要调到最优;

3、虽说上面讲到,视图有些是可以修改的。但是更多的是禁止修改视图。

对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系或者特殊的没有约束的一对多字段。还有一些特定的其他结构,这类结构会使得视图不可更新。

不可更改的情况如下:视图中含有以下的都不可被修改了。

(1)聚合函数(SUM(), MIN(), MAX(), COUNT()等)。

(2)DISTINCT。如下错误。

这里写图片描述

(3)GROUP BY

(4)HAVING

(5)UNION或UNION ALL

(6)位于选择列表中的子查询

(7)Join

(8)FROM子句中的不可更新视图

(9)WHERE子句中的子查询,引用FROM子句中的表。

(10)ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

4、视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。