答:
视图是一种虚拟表,虚拟表具备和物理表相同的功能,能够对虚拟表进行增该查操做;
视图一般是一个或多个表的行或列的子集;
视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(好比须要隐藏某些行或列),维护更方便。
游标对查询出来的结果集做为一个单元来有效的处理,游标能够定位在结果集的特定行、从结果集的当前位置检索一行或多行、能够对结果集中当前位置进行修改、数据库
视图的基础知识安全
视图是从一个或多个表中查询数据的另一种方式。利用试图,用户能够集中、简化、定制数据库
,同时还能够提供安全
保证。若是咱们常常须要从多个表中获取特定列的数据,并须要将这些数据组织在一块儿使用,就须要使用到视图。函数
视图简介性能
视图是一个虚拟表
。也就是说,对于用户来讲,视图在外观和行为上都相似于表,但他不须要实际的物理存储。试图其实是由预约义查询形式的表组成的。举例来讲,从表EMPLOYEE里建立一个视图,它只包含雇员的姓名和地址,而不是表里的所有字段。试图能够包含表的所有或部分记录,能够由一个表或多个表建立。ui
视图是从一个或多个表中导出的表,其结构和数据是创建在对标的查询基础上的
。和表同样,视图也是包括几个被定义个数据列和多个数据行,但就本质而言,这些数据列和数据行来源于它所引用的表。因此视图不是真实存在的基础表,而是一张虚表。spa
经过视图看到的数据只是存放在基本表中的数据。对视图的操做与对表的操做同样,咱们能够对其进行查询、修改(有必定的限制)和删除
。设计
当咱们对视图中国的数据进行修改时,相应的基本表数据也要发生变化;同时,若是基本表的数据发生变化,那么这种变化也能够自动地反应
到视图中。指针
视图是一种数据库对象,它是从一个或多个表或视图中导出的虚表
,即它能够从一个或多个表中的一个或多个列中提取器数据,并按照表的组成行和列来显示这些信息。code
视图在数据库中存储的是视图的定义
,而不是查询的数据。经过这个视图的定义,对视图的查询最后转化对基本表的查询。对象
视图的数据并非实际地以视图结构存储在数据中的
,而是在试图所引用的表中。试图被定义后,便存储在数据库中,经过试图看到的数据只是存放在数据库表中的数据,其结构和数据都是创建在对表的查询的基础上的。
视图的优缺点
视图有不少优势,主要体如今简化操做、定制数据、合并分割数据、安全性
等方面。
简化操做
。试图大大地简化了用户对数据的操做。在帝国一视图时,试图自己就能够是一个复杂的结果集。所以,在每一次执行相同的查询时,没必要从新写这些复杂的查询语句,只要一条简单的查询语句便可。
定制数据
。试图可以让不一样的用户,以不一样的方式看到不一样或相同的数据集。所以,当许多不一样水平的用户共用同一数据库时,这显得极为重要。好比,咱们想让公司的用户访问某些职员记录,但不想让这些用户得到诸如医疗卡号或工资之类的信息,那么就能够建立一个视图,只为他们提供应该看到的信息。
合并分割数据
。在有些状况下,因为表中数据量太大,在表的设计时,常将表进行水平分割,但表的结构的变化却会对应用程序产生不良的影响。使用视图就能够从新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍能够经过视图来重载数据。
安全性
。试图能够做为一种安全机制。经过视图,用户只能查看和修改他们所能看到的数据。其余数据库或表及不可见,也不可访问。若是某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
使用视图主要有两个缺点:
性能
。因为视图是虚拟的表,在使用包括视图引用的SQL语句时,数据库除了执行所键入的SQL语句中的查询或更新以外,还要告诉DBMS执行定义视图的查询,这就影响了查询效率。
更新限制
。不是全部的视图都是可更新的。目前,SQL将可更新的视图限制为基于单个表的,而且没有GROUP BY 或者HAVING子句的查询。除此以外,为了使视图时可更新的,试图不能使用汇集函数,计算的列或SELECT DISTINCE子句。
因为SQL对更新视图的限制,用户不能老是用视图来代替表。另外,在使用视图的状况下,咱们要综合考虑
使用视图的优点和DBMS每次执行建立视图的SQL语句引发的性能损失。
注意:
必须是sysadmin、db_owner、db_ddladmin角色的成员,或拥有建立视图的权限
。
只能在当前数据库中建立视图,在视图中最多只能引用1024
列。
若是视图引用的基表或者视图被删除,则该视图将不能再被使用
。
若是视图中的某一列是函数、数学表达式、常量或者与来自多个表的列名相同,则必须为列定义名称
。
不能在规则、默认、触发器的
定义中使用视图。
当经过视图图查询数据时,SQL Server要检查以确保语句中涉及的全部数据库对象存在
视图的名称必须遵循标识符的规则,是惟一的
。
视图的建立和销毁
CREATE VIEW/DROP VIEW
基本建立语法
视图的建立主要由CREATE VIEW关键字
实现,其数据则由SELECT语句定义。视图建立后,在数据字典中只存放视图的定义,而其中的SELECT语句并不执行
。只有当用户对视图进行操做时,才按照视图的定义将数据从基本表中取出。
建立简单的视图
建立与表具备相同信息的视图
CREATE VIEW StudentInfo_View AS SELECT * FROM StudentInfo --查看视图的数据 SELECT * FROM StudentInfo_View
为试图建立视图
实际上,咱们也能够把试图当作是一个表,还能够为视图建立视图。
CREATE VIEW Boy_View AS SELECT * FROM StudentInfo_View WHERE sex=’男’
查看视图的数据
SELECT * FROM Boy_View
因为视图是一个虚表,当表被删除时,由该表建立的视图,或视图的视图都不可用。
为表中的一列或者几列信息建立视图
CREATE VIEW NameAddress_View AS SELECT sname,address FROM StudentInfo --查看视图的数据 SELECT * FROM NameAddress_View
用户能够经过建立视图进行数据查询。例如,一个表有5列,有成千上万行,而用户须要使用表中的两行数据,这时,咱们能够为这两列建立一个试图,在视图中查询须要的数据,这样会大大提升查询效率。
建立与表具备不一样字段名的视图
前面实例建立的视图,并无指明视图的字段名,系统就默认
为表相同的字段名。实际上,建立视图时,咱们也能够为表中的数据定义新的字段名。
实际应用时,咱们要注意新定义的字段名与表中数据的对应关系
。
使用视图简化表的复杂链接
视图的一个重要用途就是进行复杂的SQL数据处理。经过建立视图,咱们能够实现多表之间的复杂链接
。将频繁使用的链接定义成视图后,用户就没必要每次使用时都要指定复杂的链接条件了。
CREATE VIEW Join_View AS SELECT sname,dname,score FROM StudentInfo,Department,RecruitInfo WHERE StudentInfo.address=RecruitInfo.address AND StudentInfo.dno=Department.dno --查看使徒的数据 SELECT * FROM Join_View
CREATE VIEW Boys_View AS SELECT * FROM StudentInfo WHERE sex='男' SELECT * FROM Boys_View
CREATE VIEW Score_View(sno,sname,sex,address,dno) AS SELECT StudentInfo.* FROM StudentInfo,RecruitInfo WHERE StudentInfo.address=RecruitInfo.address AND RecruitInfo.score>550 SELECT * FROM Score_View
CREATE VIEW BoyScore_View AS SELECT * FROM Score_View WHERE sno IN (SELECT sno FROM Boy_View) SELECT * FROM BoyScore_View
CREATE VIEW Result_View(sname,dname) AS SELECT BoyScore_View.sname,Department.dname FROM BoyScore_View,Department WHERE BoyScore_View.dno=Department.dno SELECT * FROM Result_View
因而可知,经过建立视图层层分解
,多表的复杂查询变得简洁、清楚
视图的销毁
DROP VIEW view_name
强调一点,视图在物理上是不存在的
,它实际上只是一个查询结果,是一个被存储的查询。与建立表CREATE TABLE语句不一样,CREATE TABLE语句在系统目录中保存表,而CREATE VIEW语句只保存视图的定义。因此DROP VIEW语句删除试图时,删除的也只是视图的定义,对实际表中的数据并无任何影响。
原则
和表同样,视图必须有惟一
的的名字。不只视图之间不容许有相同的名字,而且视图和表也不容许拥有相同的名字。
视图的建立个数不受限制
,用户能够建立任意多个视图。
用户要建立视图,必须从数据库管理员那里获得建立权限
试图能够嵌套
,便可以建立视图的视图
一些数据库管理系统禁止用户在查询语句中使用ORDER BY子句。
WITH CHECK OPTION
这是CREATE VIEW语句里的一个选项,其目的是确保所有的UPDATE和INSERT语句知足视图定义里的条件。
若是他们不知足条件,UPDATE或INSERT语句就会返回错误。WITH CHECK OPTION自己具备两个选项:CASCADED和LOCAL。其中,CASCADED是默认选项。在基于视图建立另外一个视图时,在对基表进行更新时,CASCADED选项会检查全部底层视图、全部完整性约束,以及新视图的定义条件。LOCAL选项只检查两个试图的完整性约束和新视图的定义条件,不检查底层的表。WITH CHECK OPTION实际上经过查看视图定义是否被破坏来确保引用完整性
。
CREATE VIEW Stu_sname_View AS SELECT * StudentInfo WHERE sname IS NOT NULL WITH CHECK OPTION
在这个范例中,WITH CHECK OPTION 会确保视图的sname字段里不包含NULL值,由于视图定义所依赖的数据里不容许在sname字段里包含NULL。
从视图建立表
CREATE TABLE TABLE_NAME AS SELECT COLUMN1,COLUMN2 FROM VIEW_TABLE
视图与ORDER BY子句
CREATE VIEW语句里不能包含ORDER BY子句,可是GROUP BY子句用于CREATE VIEW语句时,能够起到相似ORDER BY子句的做用。
CREATE VIEW NAME2 AS SELECT LAST_NAME ....FROM EM_TABLE GROUP BY LAST_NAME
什么是异名
异名就是表或视图的另外一个名称
。咱们建立别名一般是为在访问其余用户的表或视图时没必要使用完整限制名。异名能够建立为PUBLIC或PARIVATE,PUBLIC的异名能够被数据库里的其余用户使用,而PRIVATE异名只能被全部者和拥有权限的用户使用。
异名由数据库管理员(或某个指定的人员)或我的用户管理。通常来讲,所有不拥护均可以建立PRIVATE异名,而只有数据库管理员(DBA)或被受权的用户能够建立PUBLIC异名。
建立异名|删除异名
CREATE PUBLIC|PRIVATE SYSNONYM S_NAME FOR TABLE|VIEW DROP PUBLIC|PRIVATE SYSNONYM S_NAME
理解SQL游标
SQL中的一个定义特征时SQL数据库中的数据十一级和的方式来进行管理的。实际上SELECT语句的查询结果就是结果集。它由从一个或多个数据表中提取的一行或多行组成。
应用程序语言通常来讲并不可以处理以集合形式返回的数据,这样在SQL和程序设计语言之间聚会存在阻抗失配
。阻抗失配是指SQL和其余的程序设计语言之间的差异。SQL解决这类阻抗失配的方法就是使用游标。
游标充当指针
的做用,使应用程序语言一次只能处理查询结果中的一行。尽管游标能遍历查询结果中的全部行。但它一次只指一行。游标返回一个完整的结果集,但容许程序设计语言只调用集合中的一行。