视图简介:

视图可以看作定义在SQL Server上的虚拟表。视图正如其名字的含义一样,是另一种查看数据的入口。

常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 

从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图。

例如查询,插入,修改,删除操作等,但插入、修改、删除等的操作其实对于原始数据表的操作。

视图的作用:

1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。

2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)

3、从而加强了安全性,使用户只能看到视图所显示的数据。

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

语法:

 CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[ ; ] <view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}
<select_statement> ::=
[ WITH <common_table_expression> [ ,...n ] ]
SELECT <select_criteria>

参数:

schema_name:是视图所有者的名称,一般为 dbo。(指定视图所有者名称是可选的。)

view_name:是视图的名称。

column:是视图中用于列的名称。仅当列从算术表达式,函数或常数派生时,才需要列名称; 当两个或多个列可能具有相同的名称时,通常是因为连接; 或者当视图中的列被指定与其派生的列的名称不同的名称时。列名也可以在 SELECT 语句中分配。如果列未指定,则视图列获得相同的名称作为 SELECT 语句中的列。

AS:指定视图要执行的操作。

select_statement:是定义视图的 SELECT 语句。该语句可以使用多个表和其他视图。需要适当的权限才能从创建的视图的 SELECT 子句中引用的对象进行选择。

ENCRYPTION:对加密进行加密,加密之后不可修改。使用 WITH ENCRYPTION 可以防止将视图作为 SQL Server 复制的一部分进行发布。

SCHEMABINDING:将视图绑定到底层所应用到的表。指定 SCHEMABINDING 时,不能以影响视图定义的方式修改表。必须首先修改或删除视图定义,以删除要修改的表的依赖关系。使用 SCHEMABINDING 子句创建的视图的视图或表不能删除,除非该视图被删除或更改,以使其不再具有绑定。

VIEW_METADATA:当使用 WITH VIEW_METADATA 创建视图时,返回的是视图的元数据,否则返回的元数据是视图所引用表的元数据。

普通视图:

 --判断用户自定义视图是否存在
if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou --删除视图
go
create view dbo.v_Stu_Cou --创建视图
as
select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
from Student s
left join Course c on s.C_S_Id=c.C_Id
where s.C_S_Id is not null
go select * from v_Stu_Cou --使用视图查询

索引视图:

 --判断用户自定义视图是否存在
if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Index') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou_Index --删除视图
go
create view dbo.v_Stu_Cou_Index --创建视图
with schemabinding --指定架构绑定
as
select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
from dbo.Student s
inner join dbo.Course c on s.C_S_Id=c.C_Id
where s.C_S_Id is not null
go --在视图 v_Stu_Cou_Index 上建立唯一的聚集索引
create unique clustered index Index_View on v_Stu_Cou_Index(S_StuNo) select * from v_Stu_Cou_Index --使用视图查询

PS:索引视图涉及的基本表必须ANSI_NULLS设置为ON。索引视图必须设置 ANSI_NULLS 和 QUOTED_INDETIFIER 为 ON。索引视图只能引用基本表。(即不能嵌套视图)

必须使用 WITH SCHEMABINDING 绑定架构。定义索引视图时必须使用 Schema.ViewName 这样的全名。(即需要指定视图的所有者)

定义索引视图的表也必须指定所有者,例如:dbo。

定义索引视图不能使用外连接。(即 left join/left outer join、right join/right outer join、outer join/full outer join)

分区视图:

分区视图是由 UNION ALL 的所有成员表定义的视图,即拥有相同的表结构、字段、数据类型等,不相同的数据集。

分区视图又分为 本地式分区视图和分布式分区视图,我的理解就是本地式分区视图就是同一个数据库存在相同的表结构、字段、数据类型等的表使用  UNION ALL 创建的视图;

分布式分区视图就是数据源存在于不同的数据库或不同的数据库服务器使用 UNION ALL 创建的视图。

 --判断用户自定义视图是否存在
if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Par') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou_Par --删除视图
go
create view dbo.v_Stu_Cou_Par --创建视图
as
select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
from Student s1
left join Course c on s1.C_S_Id=c.C_Id
where s1.C_S_Id is not null union all select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
from Student_back s2
left join Course c on s2.C_S_Id=c.C_Id
where s2.C_S_Id is not null
go select * from v_Stu_Cou_Par --使用视图查询

当底层表的数据发生改变是,使用 sql 系统存储过程 sp_refreshview 更新视图数据。

 exec sp_refreshview 'v_Stu_Cou_Par'        -- v_Stu_Cou_Par 视图名称

使用 sql 系统存储过程 sp_helptext 获取自定义视图创建的 T-SQL 文本。

 exec sp_helptext 'v_Stu_Cou_Par'    -- v_Stu_Cou_Par 视图名称

PS:视图不能包含 ORDER BY 子句,除非SELECT语句的选择列表中还有一个 TOP 子句。

    视图不能使用 INTO 关键字。视图不能包含 OPTION 子句。

    视图不能有对临时表或表变量的引用。视图最多可以有 1024 列。

参考:

http://www.cnblogs.com/CareySon/archive/2011/12/07/2279522.html

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql

SQL Server创建视图——视图的作用的更多相关文章

  1. 在SQL Server中对视图进行增删改

    原文:在SQL Server中对视图进行增删改 Lesktop开源IM发布以后,有一些网友问及如何在嵌入IM后与自己网站的用户系统整合(即如何让嵌入的IM直接使用网站原有的用户数据库,而不需要将已有的 ...

  2. 使用SQL Server 2000索引视图提高性能

    什么是索引视图? 许多年来,Microsoft? SQL Server? 一直都提供创建虚拟表(称为视图)的功能.在过去,这些视图主要有两种用途: 提供安全机制,将用户限制在一个或多个基表中的数据的某 ...

  3. SQL Server创建、更改和删除架构

    SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...

  4. SQL Server 创建表

    SQL Server 创建表 我们在上一节中完成了数据库的创建,在本节,我们要往这个新的数据库中加入点数据,要想将数据添加到数据库,我们就必须在数据库中添加一个表,接下来来看看具体的操作. 我们的数据 ...

  5. SQL Server创建索引

    原文:SQL Server创建索引 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的 ...

  6. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  7. SQL Server 创建表分区

    原文:SQL Server 创建表分区 先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo ,) PRIMARY KEY, EmployeeName ) ...

  8. SQL Server 创建索引方法

    转自 <SQL Server 创建索引的 5 种方法> 地址:https://www.cnblogs.com/JiangLe/p/4007091.html 前期准备: create tab ...

  9. SQL Server创建表超出行最大限制解决方法

    问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行  无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...

  10. SQL Server 创建唯一约束sql语句

    SQL Server 创建唯一约束sql语句   语句示例:   在创建表是时同时创建, 创建id,name,sex三个字段的唯一索引 create table t1( id int primary ...

随机推荐

  1. 【BZOJ】1024: [SCOI2009]生日快乐(dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1024 果然现在弱到连搜索都不会了么..... 一直想二分...但是无论如何也推不出怎么划分... Q ...

  2. 邂逅明下(巴什博弈+hdu2897)

    H - 邂逅明下 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  3. 学习:inets

    inets模块 MODULE SUMMARY The inets services API.         inets:start():启动应用.

  4. hdu 4709:Herding(叉积求三角形面积+枚举)

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. 【cb2】扩展硬盘

    1.硬盘为sata串口 2.参考 http://docs.cubieboard.org/tutorials/ct1/installation/moving_rootfs_from_nandflash_ ...

  6. ChemDraw Pro绘制无环链结构的两种方法

    ChemDraw Pro 14是一款专门针对化学图形绘制而开发制作的编辑软件,是目前工科类常用的绘制化学结构工具,用于快速绘制常用的环结构组成.以下教程讲解ChemDraw Pro绘制无环链结构的两种 ...

  7. django头像上传详解

    使用form组件上传头像 实现的效果如下: 将默认的上传文件框隐藏起来变成了一个默认的头像 而且可以点击上传 处理步骤 avatar = forms.FileField( widget = widge ...

  8. LeetCode 125 Valid Palindrome(有效回文)(*)

    翻译 给定一个字符串.确定它是否是回文的,仅仅考虑当中的数字和字符并忽略其它. 比如. "A man, a plan, a canal: Panama" 是回文的. "r ...

  9. 76、android:supportsRtl 和 android:layout_marginEnd

    android4.2(SDK版本为17)有一个新特性 layoutRtl,当然是对于开发者而言的,主要是方便开发者去支持阿拉伯语/波斯语等阅读习惯是从右往左的. 可以在manifest的applica ...

  10. 移动端form表单

    始终绑定submit事件 不单独的对[提交]按钮绑定click事件,对整个表单绑定submit提交事件,这样可以让整个表单内的文本框获得Enter提交的VIP待遇,并且在移动端中可以让文本框聚焦时键盘 ...