·17·
第5章 视图和索引
一. 选择题
1.下列关于视图的说法,正确的是 B
A.视图与基本表一样,也存储数据
B.对视图的操作最终都转换为对基本表的操作 C.视图的数据源只能是基本表
D.所有视图都可以实现对数据的增、删、改、查操作 2.在视图的定义语句中,只能包含
A.数据查询语句 C.创建表的语句
A
B.数据增、删、改语句 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.设有学生表(学号,姓名,所在系)。下列建立统计每个系的学生人数的视图语句中,正确的是 D
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 所在系
17
·18· D.CREATE VIEW v1(系名,人数) AS
SELECT 所在系, COUNT(*) FROM 学生表 GROUP BY 所在系 9.设用户在某数据库中经常需要进行如下查询操作: A
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
·19·
三. 简答题
1. 试说明使用视图的好处。
答:利用视图可以简化客户端的数据查询语句,使用户能从多角度看待同一数据,可以提高数据的安全性,视图对应数据库三级模式中的外模式,因此提供了一定程度的逻辑独立性。
2. 试说明哪类视图可实现更新数据的操作,哪类视图不可实现更新数据的操作。
答:一般只涉及到一张表的行列子集,且不含分组、统计计算等操作的视图是可更新数据的,其他情况一般都不能实现数据的更新操作。
3. 使用视图可以加快数据的查询速度,这句话对吗?为什么?
答:不对,因为通过视图查询数据时,比直接针对基本表查询数据多了一个转换过程,即从外模式到模式的转换。
4. 索引的作用是什么?
答:索引可以加快数据的查询效率。
5. 索引分为哪几种类型?分别是什么?它们的主要区别是什么
答:分为聚集索引和非聚集索引两种。聚集索引会对数据进行物理排序,非聚集索引不对数据进行物理排序。
6. 聚集索引一定是唯一性索引,对吗?反之呢? 答:不对。反之也不对。
7. 在建立聚集索引时,数据库管理系统首先要将数据按聚集索引列进行物理排序。对吗? 答:对。
8. 在建立非聚集索引时,数据库管理系统并不对数据进行物理排序。对吗? 答:对。
9. 不管对表进行什么类型的操作,在表上建立的索引越多越能提高操作效率。对吗? 10. 答:不对。
11. 适合建立索引的列是什么? 答:适合建立索引的情况:
? 包含大量非重复值的列。
? 在WHERE子句中经常用于进行BETWEEN AND、>、>=、< 和 <=等操作的列。 ? 经常被用作连接操作的列。
? ORDER BY或GROUP BY子句中涉及的列。
四.上机练习
1. 写出创建满足下述要求的视图的SQL语句,并执行这些语句。将所写语句保存到一个文件中。 (1) 查询学生的学号、姓名、所在系、课程号、课程名、课程学分。
19
·20· 答: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) 查询学生的学号、姓名、选修的课程名和考试成绩。 答: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
20