数据库系统及应用教程(SQL Server 2008)习题1-8章答案 联系客服

发布时间 : 星期一 文章数据库系统及应用教程(SQL Server 2008)习题1-8章答案更新完毕开始阅读6252ab765901020207409ce3

常有效,在每一张基本表中只能有一个聚集索引。

唯一索引:不允许具有索引值相同的行,从而禁止重复的索引或键值。并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查

2.简述数据库视图和基本表的联系与区别。 答:

联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系

区别:

(1) 视图是已经编译好的sql语句,而表不是。 (2) 视图没有实际的物理记录。而表有。 (3) 表是内容,视图是窗口。

(4) 表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四

对它进行修改,但视图只能有创建的语句来修改。 (5) 表是内模式,试图是外模式

(6) 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些

SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

(7) 表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 (8) 视图的建立和删除只影响视图本身,不影响对应的基本表。 3.可更新视图必须满足哪些条件? 答:最重要的一个条件就是一个可更新视图只能包含一个表。其他的限制包括不允许使用GROUP BY子句和ORDER BY子句、不支持DISTINCT关键字、不能使用聚合函数或子查询以及不能包含计算列等。诸如此类的限制还有很多。某些SQL语句还要求一些额外的具体条件。例如,要对一个视图执行INSERT语句,则必须将所有定义为NOT NULL的列都包含在创建该视图的SELECT语句中。

4.假设某“仓库管理”关系型数据库有下列五个关系模式: 零件PART(PNO,PNAME,COLOR,WEIGHT) 项目PROJECT(JNO,JNAME,JDATE)

供应商SUPPLIER(SNO,SNAME,SADDR) 供应P_P(JNO,PNO,TOTAL)

采购P_S(PNO,SNO,QUANTITY)

(1) 试将PROJECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1, PART、P_S、SUPPLIER三个基本表的自然联接定义为一个视图VIEW2。 (2) 试在上述两个视图的基础上进行数据查询: ① 检索上海的供应商所供应的零件的编号和名字。

② 检索项目J4所用零件的供应商编号和名字。 解:

(1) CREATE VIEW VIEWl

AS SELECT A.JNO,JNAME,DATE,C.PNO,PNAME,COLOR,WEIGHT,TOTAL FROM PROJECT A,P_P B,PART C

WHERE A.JNO=B.JNO AND B.PNO=C.PNO; CREATE VIEW VIEW2

AS SELECT A.PNO,PNAME,COLOR,WEIGHT,C.SNO,SNAME,SADDR,QUANTITY

21

FROM PART A,P_S B,SUPPLIER C

WHERE A.PNO=B.PNO AND B.SNO=C.SNO; (2) ①

SELECT PNO,PNAME FROM VIEW2

WHERE SADDR LIKE ’上海%’; ② SELECT SNO,SNAME FROM VIEWl,VIEW2

WHERE VIEWl.PNO=VIEW2.PNO AND JNO=’J4’;

5. 对于教务管理数据库中基本表SC,建立视图如下: CREATE VIEW S_GRADE(SNO,C_NUM,AVG_GRADE) AS SELECT SNO,COUNT(CNO),AVG(GRADE) FROM SC

GROUP BY SNO

试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操 作:

(1) SELECT * FROM S_GRADE (2) SELECT SNO,C_NUM FROM S_GRADE

WHERE AVG_GRADE>80; (3) SELECT SNO,AVG_GRADE FROM S_GRADE

WHERE C_NUM>(SELECT C_NUM FROM S_GRADE SNO=’200912121’); (4) UPDATE S_GRADE

SET C_NUM=C_NUM+1 WHERE SNO=’200915122’ (5) DELETE FROM S_GRADE WHERE C_NUM>4;

解:

答:⑴ 允许查询。相应的操作如下:

SELECT SNO,COUNT(CNO) AS C_NUM,AVG(GRADE) AS AVG_GRADE FROM SC

GROUP BY SNO;

⑵ 允许查询。相应的操作如下:

SELECT SNO,COUNT(CNO)AS C_NUM FROM SC

GROUP BY SNO

HAVING AVG(GRADE)>80;

⑶ 允许查询。相应的操作如下:

SELECT SNO,AVG(GRADE) AS AVG_GRADE FROM SC

22

GROUP BY SNO

HAVING COUNT(CNO)>(SELECT COUNT(CNO) FROM SC

GROUP BY SNO

HAVING SNO=’200912121’);

⑷ 不允许。C_NUM是对SC中的学生选修课程的门数进行统计,在未更改SC表时,要在视图S_GRADE中更改门数,是不可能的。

⑸ 不允许。在视图S_GRADE中删除选修课程的门数在4门以上的学生元组,势必造成SC中这些学生学习元组的删除,这不一定是用户的原意,因此使用分组和聚合操作的视图,不允许用户执行更新操作。

6.简述创建索引的必要性和作用。

答:数据库的索引就类似于书籍的目录,如果想快速查找而不是逐页查找指定的内容,可以通过目录中章节的页号找到其对应的内容。类似地,索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致SQL Server搜索表中的所有记录,以获取匹配结果,这样就会大大降低查询的效率。

7.聚集索引和非聚集索引有何种异同? 答:

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。聚集索引即需要对已有表数据重新进行排序(若表中已有数据),即删除原始的表数据后再将排序结果按物理顺序插回,故聚集索引建立完毕后,建立聚集索引的列中的数据已经全部按序排列。一个表中只能包含一个聚集索引,但该索引可以包含多个列。非聚集索引类似书本索引,索引与数据存放在不同的物理区域,建立非聚集索引时数据本身不进行排序。一个表中可以含多个非聚集索引。

相同之处就是它们都是索引,都可以提高数据的查询速度。

8.用T-SQL语句,按数据库JXGL中选修课程表SC的成绩列降序创建一个普通索引(非唯一、非聚集)。

解:

USE JXGL GO

CREATE INDEX SC_GRADE ON SC(GRADE DESC) GO

第8章

1.名词解释:

存储过程 触发器 用户定义函数 答:

存储过程:是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

触发器:是一种对表进行插入、更新、删除的时候会自动执行的特殊存储过程。

23

用户定义函数:像系统内置函数一样,可以接受参数,执行复杂的操作并将操作结果以值的形式返回,也可以将结果用表格变量返回。

2.对于例5.9教学管理数据库的表S和SC,有下列程序清单,试叙述其功能。

USE JXGL GO

DECLARE @MyNo CHAR(9) SET @MyNo='S7'

IF (SELECT SDEPT FROM S WHERE SNO=@MyNo)='CS' BEGIN

SELECT AVG(GRADE) AS '平均成绩' FROM SC

WHERE SNO=@MyNo

END ELSE

PRINT '学号为'+@MyNo+'的学生不存在或不属于计算机科学系' GO

答:输入一个学生的学号,如果该学生属于计算机科学系则输出该学生的平均成绩,否则输出:该学号的学生不存在或不属于计算机科学系的提示。

3.简述存储过程与触发器的区别。

答:触发器与存储过程可以说是非常相似,可以说是一种变种的存储过程,触发器和存储过程一样都是SQL语句集。存储过程执行后驻留在计算机的高速缓冲区中,利用存储过程可以提高程序的效率,但存储过程只能通过调用来运行,可以有返回的状态值,存储过程可以在程序端调用执行。触发器是不可以在程序端调用的,它是SQL服务器端自动运行。触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。

4.AFTER触发器和INSTEAD OF触发器有什么不同?

答:AFTER触发器要求只有执行某一操作INSERT、UPDATE、DELETE之后触发器才被触发,且只能定义在表上,也可以针对表的同一操作定义多个触发器以及它们触发的顺序。而INSTEAD OF触发器表示并不执行其定义的操作(INSERT、UPDATE、DELETE)而仅是执行触发器本身。既可以在表上定义INSTEAD OF触发器,也可以在视图上定义,但对同一操作只能定义一个INSTEAD OF触发器。

5.在教学管理数据库中,创建一个名为STU_AGE的存储过程,该存储过程根据输入的学号,输出该学生的出生年份。

解:

USE JXGL GO

CREATE PROCEDURE STU_AGE @S_NAME CHAR(8) AS

SELECT YEAR(GETDATE()-AGE) AS 'YEAR' FROM S

24