IF EXISTS(SELECT name FROM sysindexes WHERE name=’depno’ DROP INDEX worker.depno GO
CREATE INDEX depno ON worker(部门号) GO
(2) SET NOCOUNT OFF USE factory
IF EXISTS(SELECT name FROM sysindexes WHERE name=’no_date’ DROP INDEX salary.no_date GO
CREATE UNIQUE CLUSTERED INDEX no_date ON salary(职工号,日期) GO
第8章 视图
一、 单项选择题
1. 下列不能执行的操作是
A. 在视图上创建索引 B. 从使用聚合函数的视图上删除数据行 C. 更改视图名称 D. 在视图上创建视图 答案:B
2. 下面定义的四个视图中,能进行更新操作的是 A.CREATE VIEW S_G(S#,SNAME,CNAME,GRADE) AS SELECT S.S#,SNAME,CNAME,GRADE FROM S,SC,C
WHERE S.S#=SC.S# AND SC.C#=C.C# B.CREATE VIEW S AVG_G(S#,AVG_GRADE) AS SELECT S#,AVG(GRADE) FROM SC
WHERE GRADE IS NOT NULL GROUP BY S#
C.CREATE VIEW S_MALE(S#,SNAME) AS SELECT S#,SNAME FROM S
WHERE AGE>=20
D.CREATE VIEW S_FEMALE(SNAME,AGE) AS SELECT SNAME,AGE FROM S
WHERE SEX=’女’ 答案:C
3. 下列描述中正确的是
A. 视图只能从一个表导出 B. 视图不能从其他视图中产生 C. 视图定义相关的数据保存在数据库中 D. 视图可以从一个或多个表中导出 答案:D
4. 定义视图可以包含
A. GROUP BY 子句 B. ORDER BY 子句
C. COMPUTE BY 子句 D. INTO子句 答案:A
5. 下列描述中错误的是
A. 可以在基表上创建视图 B. 可以在视图上创建视图 C. 可以在临时表上创建视图 D. 不能在视图上定义全文索引 答案:C
二、填空题
1.要使视图的定义不可见,只要在创建视图时,使用 关键字加密视图定义即可。 答案:WITH ENCRYPTION
2.更改视图名称将导致引用该视图的 、 及 无效,要使这些数据库对象重新有效,就必须对这些数据库对象重新定义。 答案:存储过程、视图、触发器
三、简答题
1.什么是视图?使用视图的优点和缺点是什么?
答案:视图是一个由SELECT语句指定,用于检索数据库表中某些行或列数据的语句存储定义。从本质上说,视图其实是一种SQL查询。
使用视图的优点如下:
(1)查询的简单性。将复杂的查询定义为视图,保留了用户所关心的数据内容,剔除了那些不必要的冗余数据,使其数据环境更加容易控制,从而达到简化用户浏览和操作的目的。
(2)安全保护。数据库管理员可以在限制表用户的基础上进一步限制视图用户,可以为各种不同的用户授予或撤消在视图上的操作权限,这样,视图用户只能查询或修改他们各自所能见到的数据,从而保证数据库中数据的安全。
(3)掩盖数据库的复杂性。使用视图可以把数据库的设计和用户的使用屏蔽开来,当基本表发生更改或重新组合时,只需要修改视图的定义即可。用户还能够通过视图获得和数据库中的表一致的数据。
使用视图的缺点如下:
(1)性能的降低。SQL Server必须把对视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,即使是对视图的一个简单查询,SQL Server也把它变成一个复杂的对基本表的连接查询,会产生一定的时间开销。
(2)修改的限制。当用户要修改视图的某些行时,SQL Server必须把它转化为对基本表行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图来说,这可能是不可修改的。
2. 为什么将SQL中的视图称为“虚表”?
答案:在SQL中创建一个视图时,系统只是将视图的定义存放在数据字典中,并不存储视图对应的数据,在用户使用视图时才去求对应的数据。因此,将视图称为“虚表”。这样处理的目的是为了节约存储空间,因为视图对应的数据都可从相应的基本表中获得。
3. 修改视图中的数据会受到哪些限制? 答案:修改视图中的数据会受到的限制如下:
(1)无论是视图的创建、修改、删除,还是视图数据的查询、插入、更新、删除,都必须由具有权限的用户进行。 (2)对由多个表连接成的视图修改数据时,不能同时影响一个以上的基表,也不允许删除视图中的数据。 (3)对视图上的某些列不能进行修改。这些列是:计算值、内置函数和行集合函数。
(4)对具有NOT NULL 的列进行修改时可能会出错。在通过视图修改或插入数据时,必须保证未显示的具有NOT NULL 属性的列有值,可以是默认值、identity等,否则不能向视图中插入数据行。
(5) 如果某些列因为规则或者约束的限制不能接受从视图插入数据时,则插入数据可能会失败。 (6)删除基表并不删除视图。建议采用与表明显不同的名字命名视图。
四、程序设计题
1.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)建立视图View1,查询所有职工的职工号、姓名、部门名和2004年2月份工资,并按部门名顺序排列。 (2)建立视图View2,查询所有职工的职工号、姓名和平均工资。 (3)建立视图View3,查询各部门名和该部门所有职工平均工资。 (4)显示视图View3的定义 答案:
(1)USE factory GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME=’View1’) DROP VIEW View1 GO
CREATE VIEW View1
AS SELECT TOP 15 worker.职工号,worker.姓名,depart.部门名,
salary.工资 AS ‘2004年2月工资’
FROM worker,depart,salary
WHERE worker.部门号=depart.部门号 AND worker.职工号=salary.职工号 AND YEAR(salary.日期)=2004 AND MONTH(salary.日期)=2 ORDER BY worker.部门号 GO
SELECT * FROM View1 GO
(2)USE factory GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME=’View2’) DROP VIEW View2 GO
CREATE VIEW View2
AS SELECT worker.职工号,worker.姓名,AVG(salary.工资) AS ‘平均工资’ FROM worker,salary
WHERE worker.职工号=salary.职工号 GROUP BY worker.职工号,worker.姓名 GO
SELECT * FROM View2 GO
(3)USE factory GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME=’View3’) DROP VIEW View3 GO
CREATE VIEW View3
AS SELECT depart.部门名, AVG(salary.工资) AS ‘平均工资’ FROM worker,depart,salary
WHERE worker.部门号=depart.部门号 AND worker.职工号=salary.职工号 GROUP BY depart.部门名 GO
SELECT * FROM View3 GO
(4)USE factory GO
EXEC sp_helptext ‘View3’ GO
第9章 数据库完整性
一、单项选择题
1. 定义基本表时,若要求某一列的值不能为空,则应在定义时使用的保留字是
A. NULL B. NOT NULL C. DISTINCT D. UNIQUE 答案:B
2. 使用DROP语句撤消基本表时,可将下属的视图和约束引用全部撤消使用的子句是
A. NULL B. RESTRICT C. CASCADE D. DISTINCT 答案:C
3. 使用DROP语句撤消基本表时,只有当引用该基本表中的视图或约束撤消时才能撤消,使用的子句是
A. NULL B. RESTRICT C. CASCADE D. DISTINCT 答案:B
4.数据完整性保护中的约束条件主要是指
A. 用户操作权限的约束 B. 用户口令校对 C. 值的约束和结构的约束 D. 并发控制的约束 答案:C
5.数据的正确性和相容性是指数据的
A. 安全性 B.完整性 C. 并发控制 D.恢复 答案:B
二、填空题
1. SQL Server 2000自动强制数据完整性的方式有 、 、 、 、 五种。 答案:主键约束、外键约束、惟一约束、检查约束、非空约束
2.除了SQL Server 2000自动强制的数据完整性外,还可以使用 、 、 约束方式。 答案:触发器、规则、默认值
3.FOREIGN KEY约束在 上实施,PRIMARY KEY约束在 上实施。 答案:表、行
4.UNIQUE约束在列集内强制执行值的 。 答案:惟一性
5.如果在插入行时没有指定列的值,则 指定列中所使用的值。 答案:默认值
三、简答题
1. 什么是数据完整性?如果数据库不实施数据完整性会产生什么结果?
答案:数据完整性是指数据的正确性、有效性和一致性,是衡量数据库质量好坏的重要标准。如果数据库不实施数据完整性,在用INSERT、UPDATE、DELETE语句修改数据库内容时,数据的完整性可能会遭到破坏,就可能会存在下列情况:无效的数据被添加到数据库的表中,如将学生考试成绩输入成负数;对数据库的修改不一致,如在一个表中修改了某学生的学号,但该学生的学号在另一个表中却没有得到修改;将存在的数据修改为无效的数据,如将某学生的班号修改为并不存在的班号。
2.数据完整性有哪几类?如何实施?它们分别在什么级别上实施? 答案:数据完整性分为以下3类:
(1)域完整性。是指一个列的输入有效性,是否允许为空值。强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式或可能值的范围(通过CHECK约束和规则),如学生的考试成绩必须在0~100分之间,性别只能是“男”或“女”。
(2)实体完整性。是指保证表中所有的行惟一。实体完整性要求表中的所有行都有一个惟一标识符,这个惟一的标识符可能是一列,也可能是几列的组合,称之为主键,也就是说,表中的主键在所有行上必须取惟一值。强制实体完整性的方法有:索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性。
(3)参照完整性。是指保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。外键值将引用表中包含此外键的记录和被引用表中主键和外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。这样的一致性要求确保不会引起不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。参照完整性是基于外键和主键之间的关系。强制参照完整性的方法有:FOREIGN KEY束。
域完整性、实体完整性及参照完整性分别在列、行、表上实施。数据完整性任何时候都可以实施,但对已有数据的表实施数据完整性时,系统先检查表中的数据是否满足所实施的完整性,只有表中的数据满足了所实施的完整性,数据完整性才能实施成功。
3. 什么是主键约束?什么是惟一约束?两者有什么区别?
答案:主键约束保证某一列或一组列值的组合相对于表中的每一行都是惟一的,这些列就是该表的主键。主键不允许有重复值,也不允许有空值。
惟一约束限制表中指定列上所有的非空值必须惟一,即表中任意两行在指定列上都不允许相同的值。 惟一约束和主键约束的区别是:
(1)惟一约束与主键约束都为指定的列建立惟一索引,即不允许惟一索引的列上有相同的值。主键约束限制更严格,不但不允许有重复值,而且也不允许有空值。
(2)惟一约束与主键约束产生的索引可以是聚簇索引也可以是非聚簇索引,但在默认情况下惟一约束产生非聚簇索引,主键约束产生聚簇索引。
4.创建PRIMARY KEY约束或UNIQUE约束时,SQL Server创建索引了吗?与创建标准索引相比哪个更好?
答案:创建PRIMARY KEY约束或UNIQUE约束时,SQL Server创建惟一性索引。与创建标准索引相比,通过创建PRIMARY KEY约束或UNIQUE约束来创建索引更好。