SQLServer之视图简介
视图定义
视图是一个虚拟表,其内容由查询定义。 同表一样,视图包含一系列带有名称的列和行数据。 视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。 定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。 分布式查询也可用于定义使用多个异类源数据的视图。 例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。
视图通常用来集中、简化和自定义每个用户对数据库的不同认识。 视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。 视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。 还可以在向 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之视图简介的更多相关文章
- MySQL视图简介与操作
1.准备工作 在MySQL数据库中创建两张表balance(余额表)和customer(客户表)并插入数据. create table customer( id int(10) primary key ...
- SQLSERVER系统视图,系统表,sys.sql_modules视图
SQLServer中提供了相当丰富的系统视图,能够从宏观到微观,从静态到动态反应数据库对象的存储结果.系统性能.系统等待事件等等.同时 也保留了与早期版本兼容性的视图,主要差别在于SQLServer2 ...
- SQLServer之锁简介
锁定义(Definition) 锁定是 DBMS 将访问限制为多用户环境中的行的过程. 以独占方式锁定行或列,不允许其他用户访问锁定的数据,直到锁被释放. 这可确保两个用户不能同时更新行中的同一列. ...
- SQLServer之触发器简介
触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...
- SQLServer之索引简介
索引设计基础知识 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速 ...
- Sqlserver 系统视图简单说明
1. 查看系统视图的sql语句 select * from sys.system_views 2. 查看所有的 dynamic management 视图的sql select * from sys. ...
- SqlServer在视图上创建索引
在视图上创建索引需要三个条件: 一.视图必须绑定到架构. 要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击 ...
- SQLSERVER系统视图 sql server系统表详细说明
参考 https://www.cnblogs.com/luluping/archive/2012/11/05/2754639.html https://www.cnblogs.com/litubin/ ...
- 刷新SqlServer所有视图元数据的存储过程
摘自: http://www.cnblogs.com/yashen/archive/2004/12/23/81000.html 我们在使用SqlServer时经常遇到这种情况,当修改某个表的结构后,相 ...
随机推荐
- 跳槽 & 思维导图
个人博客原文: 跳槽 & 思维导图 今年的冬天有点"冷".给大家来点实在的东西. 不知道大家在跳槽的时候是怎么做的?直接投简历面试?还是准备了一段时间,复习一波知识点后再投 ...
- 死磕 java集合之CopyOnWriteArrayList源码分析
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过 ...
- IdentityServer4实战 - 必须使用HTTPS问题解析
一. 前言 关于必须使用HTTPS这个问题,很多朋友都在群里问到了,不过由于这个问题很简单,一直也没通过文章的方式记录下来,今日有时间,便说说它的前因后果吧,给需要的人解惑~. 二. 问题发生 本文所 ...
- 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇
转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
- ASP.NET Core使用Jaeger实现分布式追踪
前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. ...
- 理解 docker 容器中的 uid 和 gid
默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上 ...
- H5 和 CSS3 新特性
博客地址:https://ainyi.com/52 H5 新特性 语义化标签:header.footer.section.nav.aside.article 增强型表单:input 的多个 type ...
- 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- javascript基础修炼(9)——MVVM中双向数据绑定的基本原理
开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 概述 1.1 MVVM模型 MVVM模型是前端单页面应用中非常重要的模型之一,也是Single Page Appl ...