答:视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增该查操作; 视图通常是一个或多个表的行或列的子集; 视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如需要隐藏某些行或列),维护更方便。游标对查询出来的结果集作为一个单元来有效的处理,游标可以定位在结果集的特定行、从结果集的当前位置检索一行或多行、可以对结果集中当前位置进行修改、
视图的基础知识
视图是从一个或多个表中查询数据的另外一种方式。利用试图,用户可以集中、简化、定制数据库,同时还可以提供安全保证。如果我们经常需要从多个表中获取特定列的数据,并需要将这些数据组织在一起使用,就需要使用到视图。
视图简介
视图是一个虚拟表。也就是说,对于用户来说,视图在外观和行为上都类似于表,但他不需要实际的物理存储。试图实际上是由预定义查询形式的表组成的。举例来说,从表 EMPLOYEE 里创建一个视图,它只包含雇员的姓名和地址,而不是表里的全部字段。试图可以包含表的全部或部分记录,可以由一个表或多个表创建。
视图是从一个或多个表中导出的表,其结构和数据是建立在对标的查询基础上的。和表一样,视图也是包括几个被定义个数据列和多个数据行,但就本质而言,这些数据列和数据行来源于它所引用的表。所以视图不是真实存在的基础表,而是一张虚表。
通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,我们可以对其进行查询、修改(有一定的限制)和删除。
当我们对视图中国的数据进行修改时,相应的基本表数据也要发生变化;同时,如果基本表的数据发生变化,那么这种变化也可以自动地反应到视图中。
视图是一种数据库对象,它是从一个或多个表或视图中导出的虚表,即它可以从一个或多个表中的一个或多个列中提取器数据,并按照表的组成行和列来显示这些信息。
视图在数据库中存储的是视图的定义,而不是查询的数据。通过这个视图的定义,对视图的查询最后转化对基本表的查询。
视图的数据并不是实际地以视图结构存储在数据中的,而是在试图所引用的表中。试图被定义后,便存储在数据库中,通过试图看到的数据只是存放在数据库表中的数据,其结构和数据都是建立在对表的查询的基础上的。
视图的优缺点
视图有很多优点,主要体现在简化操作、定制数据、合并分割数据、安全性等方面。
简化操作。试图大大地简化了用户对数据的操作。在帝国一视图时,试图本身就可以是一个复杂的结果集。因此,在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询语句即可。
定制数据。试图能够让不同的用户,以不同的方式看到不同或相同的数据集。因此,当许多不同水平的用户共用同一数据库时,这显得极为重要。比如,我们想让公司的用户访问某些职员记录,但不想让这些用户获得诸如医疗卡号或工资之类的信息,那么就可以创建一个视图,只为他们提供应该看到的信息。
合并分割数据。在有些情况下,由于表中数据量太大,在表的设计时,常将表进行水平分割,但表的结构的变化却会对应用程序产生不良的影响。使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
安全性。试图可以作为一种安全机制。通过视图,用户只能查看和修改他们所能看到的数据。其他数据库或表及不可见,也不可访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
使用视图主要有两个缺点:
性能。由于视图是虚拟的表,在使用包括视图引用的 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 解决这类阻抗失配的方法就是使用游标。
游标充当指针的作用,使应用程序语言一次只能处理查询结果中的一行。尽管游标能遍历查询结果中的所有行。但它一次只指一行。游标返回一个完整的结果集,但允许程序设计语言只调用集合中的一行。