视图定义

视图是一个虚拟表,其内容由查询定义。 同表一样,视图包含一系列带有名称的列和行数据。 视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

对其中所引用的基础表来说,视图的作用类似于筛选。 定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。 分布式查询也可用于定义使用多个异类源数据的视图。 例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。

视图通常用来集中、简化和自定义每个用户对数据库的不同认识。 视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。 视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。 还可以在向 SQL Server 复制数据和从其中复制数据时使用视图,以便提高性能并对数据进行分区。

视图类型

除了基本用户定义视图的标准角色以外, SQL Server 还提供了下列类型的视图,这些视图在数据库中起着特殊的作用:

索引视图
索引视图是被具体化了的视图。 这意味着已经对视图定义进行了计算并且生成的数据像表一样存储。 可以为视图创建索引,即对视图创建一个唯一的聚集索引。 索引视图可以显著提高某些类型查询的性能。 索引视图尤其适于聚合许多行的查询。 但它们不太适于经常更新的基本数据集。

分区视图
分区视图在一台或多台服务器间水平连接一组成员表中的分区数据。 这样,数据看上去如同来自于一个表。 联接同一个 SQL Server 实例中的成员表的视图是一个本地分区视图。

系统视图
系统视图公开目录元数据。 您可以使用系统视图返回与 SQL Server 实例或在该实例中定义的对象有关的信息。 例如,你可以查询 sys.databases 目录视图以便返回与实例中提供的用户定义数据库有关的信息。 有关详细信息,请参阅系统视图 (Transact-SQL)。

视图应用场景

可以将视图用于以下用途:

  • 集中、简化和自定义每个用户对数据库的认识。

  • 用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问底层基表的权限。

  • 提供向后兼容接口来模拟架构已更改的表。

  • 为最终用户减少数据库呈现的复杂性,客户端只要对视图写简单的代码,就能返回所需要的数据,一些复杂的逻辑操作,放在了视图中来完成。

  • 对视图添加一些额外的索引,来提高查询的效率。
  • 可以合并分离的数据,创建分区视图。

视图创建注意事项

只能在当前数据库中创建视图。 CREATE VIEW 必须是查询批处理中的第一条语句。 视图最多可以包含 1024 列。

创建视图时,有关该视图的信息将存储在下列目录视图中:sys.views、sys.columns 和 sys.sql_expression_dependencies。CREATE VIEW 语句的文本将存储在 sys.sql_modules 目录视图中。

创建视图时, 数据库引擎将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。 使用视图时,将使用这些原始设置来分析视图。 因此,访问视图时,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的任何客户端会话设置都不会影响视图定义。

视图定义中的 SELECT 子句不能包括下列内容:

    • ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句。ORDER BY 子句仅用于确定视图定义中的 TOP 或 OFFSET 子句返回的行。 ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。

    • INTO 关键字。

    • OPTION 子句。

    • 引用临时表或表变量:

      因为 select_statement 使用 SELECT 语句,所以按照 FROM 子句的指定,使用 <join_hint> 和 <table_hint> 提示是有效的。有关详细信息,请参阅 FROM (Transact-SQL) 和 SELECT (Transact-SQL)。

      UNION 或 UNION ALL 分隔的函数和多个 SELECT 语句可在 select_statement 中使用。

      CHECK OPTION
      要求对该视图执行的所有数据修改语句都必须符合 select_statement 中所设置的条件。 通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到数据。

视图更新

只要满足下列条件,即可通过视图修改基础基表的数据:

  • 任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。

  • 视图中被修改的列必须直接引用表列中的基础数据。 不能通过任何其他方式对这些列进行派生,如通过以下方式:

    • 聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。

    • 计算。 不能从使用其他列的表达式中计算该列。 使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。

  • 被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。

  • TOP 在视图的 select_statement 中的任何位置都不会与 WITH CHECK OPTION 子句一起使用。

    上述限制应用于视图的 FROM 子句中的任何子查询,就像其应用于视图本身一样。 通常情况下, 数据库引擎必须能够明确跟踪从视图定义到一个基表的修改。 有关详细信息,请参阅通过视图修改数据。

如果上述限制妨碍直接通过视图修改数据,则可以考虑以下选项:

  • INSTEAD OF 触发器

    可以对视图创建 INSTEAD OF 触发器,以使视图可更新。 将执行 INSTEAD OF 触发器,而不是执行对其定义了触发器的数据修改语句。 此触发器允许用户指定必须发生以处理数据修改语句的操作集合。 因此,如果存在给定的数据修改语句(INSERT、UPDATE 或 DELETE)的视图的 INSTEAD OF 触发器,则可通过该语句更新相应的视图。 有关 INSTEAD OF 触发器的详细信息,请参阅 DML 触发器。

  • 分区视图

    如果视图为分区视图,则可遵循某些限制对其进行更新。 必要时, 数据库引擎将本地分区视图辨别为所有参与表和视图都在同一 SQL Server 实例上的视图,而将分布式分区视图辨别为视图中至少有一个表驻留在其他或远程服务器上的视图。

视图优缺点

优点:

1、向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以提交数据,就像这些来自于某个单一的表。

2、数据安全。

3、可以给视图加密。

4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。

缺点:

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

2、修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。

3、数据库表结构的修改可能需要修改相应的视图,维护和迁移麻烦。

SQLServer之视图简介的更多相关文章

  1. MySQL视图简介与操作

    1.准备工作 在MySQL数据库中创建两张表balance(余额表)和customer(客户表)并插入数据. create table customer( id int(10) primary key ...

  2. SQLSERVER系统视图,系统表,sys.sql_modules视图

    SQLServer中提供了相当丰富的系统视图,能够从宏观到微观,从静态到动态反应数据库对象的存储结果.系统性能.系统等待事件等等.同时 也保留了与早期版本兼容性的视图,主要差别在于SQLServer2 ...

  3. SQLServer之锁简介

    锁定义(Definition) 锁定是 DBMS 将访问限制为多用户环境中的行的过程. 以独占方式锁定行或列,不允许其他用户访问锁定的数据,直到锁被释放. 这可确保两个用户不能同时更新行中的同一列. ...

  4. SQLServer之触发器简介

    触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...

  5. SQLServer之索引简介

    索引设计基础知识 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速 ...

  6. Sqlserver 系统视图简单说明

    1. 查看系统视图的sql语句 select * from sys.system_views 2. 查看所有的 dynamic management 视图的sql select * from sys. ...

  7. SqlServer在视图上创建索引

    在视图上创建索引需要三个条件: 一.视图必须绑定到架构. 要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击 ...

  8. SQLSERVER系统视图 sql server系统表详细说明

    参考 https://www.cnblogs.com/luluping/archive/2012/11/05/2754639.html https://www.cnblogs.com/litubin/ ...

  9. 刷新SqlServer所有视图元数据的存储过程

    摘自: http://www.cnblogs.com/yashen/archive/2004/12/23/81000.html 我们在使用SqlServer时经常遇到这种情况,当修改某个表的结构后,相 ...

随机推荐

  1. scala的break和continue

    scala 是没有 continue 的,但是包含 break,可以用 break 构造出 continue 的效果 这里用到了库: import scala.util.control.Breaks. ...

  2. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

  3. java算法(1)---余弦相似度计算字符串相似率

    余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...

  4. redis 系列21 复制Replication (上)

    一.   概述 使用和配置主从复制非常简单,每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave ...

  5. mac用户丢失管理员身份急救

    用了这么久mac,发现居然还存在这么大一个bug.就是如果你曾经编辑mac电脑默认用户资料,比如试图改用户名.试图改HOME路径之类的,有很高比率可能导致该用户丧失管理员权限. 随后悲剧就开始了,所有 ...

  6. 使用Spring Cloud搭建服务注册中心

    我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...

  7. 服务测试碰钉子Server GC

    如果发现你的dotnet core服务并发上不去,但cpu资源还比较充足那就要注意了!因为这很有可能是你没有设置一个运行项导致...,下面要提到的就是GC.Server这玩意,实际上项目编译中并没有这 ...

  8. 【ASP.NET Core快速入门】(十)Cookie-based认证实现

    准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController ...

  9. ARP协议分析

    一.ARP概述 网络中所有的协议(HTTP.URL.FTP.TELNET.TCP.UDP.ARP ······)都包含在TCP/IP协议栈中,从使用上来看:其中大部分协议都是大家平常上网所接触到的,不 ...

  10. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(3)- 音频显示实现(Matplotlib, NumPy1.15.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之音频显示实现. 音频显示是Jays-PySPEECH的主要功能,Jays-PySPEECH借 ...