数据库原理及应用(第2版)习题参考答案.. 下载本文

·16· where grade = (

select min(grade) from sc

join course c on c.cno = sc.cno where cname = 'vb') and cno in(

select cno from course where cname = 'vb')

16

第5章 视图和索引 一. 选择题

1.下列关于视图的说法,正确的是 B

A.视图与基本表一样,也存储数据

B.对视图的操作最终都转换为对基本表的操作 C.视图的数据源只能是基本表

D.所有视图都可以实现对数据的增、删、改、查操作 2.在视图的定义语句中,只能包含

A

A.数据查询语句 B.数据增、删、改语句 C.创建表的语句

D.全部都可以

3.视图对应数据库三级模式中的_________。

A. 外模式 B. 内模式 C. 模式 D. 其他

4.下列关于通过视图更新数据的说法,错误的是 A

A.如果视图的定义涉及到多张表,则对这种视图一般情况下允许进行更新操作 B.如果定义视图的查询语句中含有GROUP BY子句,则对这种视图不允许进行更新操作 C.如果定义视图的查询语句中含有统计函数,则对这种视图不允许进行更新操作 D.如果视图数据来自单个基本表的行、列选择结果,则一般情况下允许进行更新操作 5.下列关于视图的说法,正确的是

B

A.通过视图可以提高数据查询效率

B.视图提供了数据的逻辑独立性 C.视图只能建立在基本表上

D.定义视图的语句可以包含数据更改语句 6.创建视图的主要作用是

D

A.提高数据查询效率 B.维护数据的完整性约束 C.维护数据的一致性 D.提供用户视角的数据

7.建立索引可以加快数据的查询效率。在数据库的三级模式结构中,索引属于 A

A.内模式 B.模式 C.外模式

D.概念模式

8.设有学生表(学号,姓名,所在系)。下列建立统计每个系的学生人数的视图语句中,正确的是A.CREATE VIEW v1 AS

SELECT 所在系, COUNT(*) FROM 学生表 GROUP BY 所在系 B.CREATE VIEW v1 AS

SELECT 所在系, SUM(*) FROM 学生表 GROUP BY 所在系 C.CREATE VIEW v1(系名,人数) AS

SELECT 所在系, SUM(*) FROM 学生表 GROUP BY 所在系 D.CREATE VIEW v1(系名,人数) AS

SELECT 所在系, COUNT(*) FROM 学生表 GROUP BY 所在系

17

·17· D

·18·

A

9.设用户在某数据库中经常需要进行如下查询操作:

SELECT * FROM T WHERE C1=’A’ ORDER BY C2

设T表中已在C1列上建立了主码约束,且该表只建有该约束。为提高该查询的执行效率,下列方法中可行的是

C

A.在C1列上建立一个聚集索引,在C2列上建立一个非聚集索引 B.在C1和C2列上分别建立一个非聚集索引 C.在C2列上建立一个非聚集索引

D.在C1和C2列上建立一个组合的非聚集索引 10.下列关于索引的说法,正确的是

C

A.只要建立了索引就可以加快数据的查询效率

B.当一个表上需要创建聚集和非聚集索引时,应该先创建非聚集索引,然后再创建聚集索引,这种顺序会使创建索引的效率比较高

C.在一个表上可以建立多个唯一的非聚集索引

D.索引会影响数据插入和更新数据的执行效率,但不会影响删除数据的执行效率

11.下列关于CREATE UNIQUE INDEX IDX1 ON T(C1,C2)语句作用的说法,正确的是 D

A.在C1和C2列上分别建立一个唯一聚集索引 B.在C1和C2列上分别建立一个唯一非聚集索引 C.在C1和C2列的组合上建立一个唯一聚集索引 D.在C1和C2列的组合上建立一个唯一非聚集索引

二. 填空题

1.对视图的操作最终都转换为对_____操作。 基本表

2.视图是虚表,在数据库中只存储视图的_____,不存储视图的数据。 定义 3.修改视图定义的语句是_____。 ALTER VIEW 4.视图对应数据库三级模式中的_____模式。 外

5.在一个表上最多可以建立_____个聚集索引,可以建立_____个非聚集索引。 一 ,多

6.当在T表的C1列上建立聚集索引后,数据库管理系统会将T表数据按 _____ 列进行 _____。

C1 物理排序

7.索引建立的合适,可以加快数据_____操作的执行效率。 查询

8.在employees表的phone列上建立一个非聚集索引的SQL语句是_____

CREATE INDEX IDX1 ON employees(phone)

或:CREATE NONCLUSTERED INDEX IDX1 ON employees(phone)

9.设有student表,结构为Student(Sno,Sname,Sdept)。现要在该表上建立一个统计每个系的学生人数的视图,视图名为V_dept,视图结构为(系名,人数)。请补全下列定义该视图的SQL语句 V_dept (系名,人数) , GROUP BY Sdept CREATE VIEW _____ AS

SELECT Sdept, COUNT(*) _____

10.非聚集索引的B-树中,叶级节点中每个索引行由索引键值和_____组成。 行指示器

三. 简答题

18

1. 试说明使用视图的好处。

·19· 答:利用视图可以简化客户端的数据查询语句,使用户能从多角度看待同一数据,可以提高数据的安全性,视图对应数据库三级模式中的外模式,因此提供了一定程度的逻辑独立性。

2. 试说明哪类视图可实现更新数据的操作,哪类视图不可实现更新数据的操作。

答:一般只涉及到一张表的行列子集,且不含分组、统计计算等操作的视图是可更新数据的,其他情况一般都不能实现数据的更新操作。

3. 使用视图可以加快数据的查询速度,这句话对吗?为什么?

答:不对,因为通过视图查询数据时,比直接针对基本表查询数据多了一个转换过程,即从外模式到模式的转换。

4. 索引的作用是什么?

答:索引可以加快数据的查询效率。

5. 索引分为哪几种类型?分别是什么?它们的主要区别是什么

答:分为聚集索引和非聚集索引两种。聚集索引会对数据进行物理排序,非聚集索引不对数据进行物理排序。

6. 聚集索引一定是唯一性索引,对吗?反之呢? 答:不对。反之也不对。

7. 在建立聚集索引时,数据库管理系统首先要将数据按聚集索引列进行物理排序。对吗? 答:对。

8. 在建立非聚集索引时,数据库管理系统并不对数据进行物理排序。对吗? 答:对。

9. 不管对表进行什么类型的操作,在表上建立的索引越多越能提高操作效率。对吗? 10. 答:不对。

11. 适合建立索引的列是什么? 答:适合建立索引的情况:

? ? ? ?

四.上机练习

1. 写出创建满足下述要求的视图的SQL语句,并执行这些语句。将所写语句保存到一个文件中。 (1) 查询学生的学号、姓名、所在系、课程号、课程名、课程学分。 答:Create view v1 As

Select s.sno,sname,sdept,c.cno,cname,credit From student s join sc on s.sno = sc.sno Join course c on c.cno = sc.cno

(2) 查询学生的学号、姓名、选修的课程名和考试成绩。

19

包含大量非重复值的列。

在WHERE子句中经常用于进行BETWEEN AND、>、>=、< 和 <=等操作的列。 经常被用作连接操作的列。

ORDER BY或GROUP BY子句中涉及的列。

·20· 答:Create view v2 As

Select s.sno,sname,cname,grade

From student s join sc on s.sno = sc.sno Join course c on c.cno = sc.cno

(3) 统计每个学生的选课门数,列出学生学号和选课门数。 答:Create view v3 As

Select sno,count(*) as total From sc group by sno

(4) 统计每个学生的修课总学分,列出学生学号和总学分(说明:考试成绩大于等于60才可获得此门课程的学

分)。

答:Create view v4 As

Select sno,sum(credit) as total_credit From sno join course c on c.cno = sc.cno Where grade >= 60 Group by sno

2. 利用第1题建立的视图,写出完成如下查询的SQL语句,并执行这些语句,查看执行结果。将查询语句和执行

结果保存到一个文件中。

(1) 查询考试成绩大于等于90分的学生的姓名、课程名和成绩。 答:Select sname,cname,grade From v2 where grade >= 90

(2) 查询选课门数超过3门的学生的学号和选课门数。 答:Select * from v3 where total >= 3

(3) 查询计算机系选课门数超过3门的学生的姓名和选课门数。

答:Select sname,total from v3 join student s on s.sno = v3.sno Where sdept = ‘计算机系’ and total >= 3

(4) 查询修课总学分超过10分的学生的学号、姓名、所在系和修课总学分。 答:Select v4.sno,sname,sdept,total_credit From v4 join student s on s.sno = v4.sno Where total_credit >= 10

(5) 查询年龄大于等于20岁的学生中,修课总学分超过10分的学生的姓名、年龄、所在系和修课总学分。 答:Select sname,sage,sdept,total_credit From v4 join student s on s.sno = v4.sno Where sage >= 20 and total_credit >= 10

3. 修改第1题(4)定义的视图,使其查询每个学生的学号、总学分以及总的选课门数。 答: Alter view v4 As

Select sno,sum(credit) as total_credit,count(*) as total_cno

From sc join course c on c.cno = sc.cno Group by sno

20