15.查询计算机系哪些学生没有选课,列出学生姓名。
Select sname from student s left join sc on s.sno = sc.sno Where sdept = ‘计算机系’ and sc.sno is null 16.用子查询实现如下查询:
(1)查询选修了“C001”号课程的学生的姓名和所在系。 Select sname,sdept from student
Where sno in (select sno from sc where cno = ‘C001’) (2)查询通信工程系成绩80分以上的学生的学号和姓名。 Select sno,sname from student
Where sdept = ‘通信工程系’ and sno in ( Select sno from sc where grade > 80)
(3)查询计算机系考试成绩最高的学生的姓名。
Select sname from student s join sc on s.sno = sc.sno Where sdept = ‘计算机系’ and grade = (
Select max(grade) from sc join student s on s.sno=sc.sno Where sdept = ‘计算机系’)
(4)查询年龄最大的男学生的姓名和年龄。
Select sname,sage from student
Where sage = (select max(sage) from student where ssex = ‘男’)
and ssex = ‘男’
(5)查询“C001”号课程的考试成绩高于该课程平均成绩的学生的学号和成绩。 Select sno,grade from sc
Where cno = ‘C001’ and grade >(
Select avg(grade) from sc where cno = ‘C001’)
17.创建一个新表,表名为test_t,其结构为(COL1, COL 2, COL 3),其中,
COL1:整型,允许空值。
COL2:字符型,长度为10,不允许空值。
COL3:字符型,长度为10,允许空值。
试写出按行插入如下数据的语句(空白处表示空值)。
COL1 1 2 Create table test_t( COL1 int,
COL2 char(10) not null, COL3 char(10))
6
COL2 B1 B2 B3 COL3 C2
Insert into test_t(COL2) values(’B1’)
Insert into test_t(COL1,COL2) values(1,’B2’) Insert into test_t values(2,’B3’,NULL) 18.删除成绩小于50分的学生的选课记录。
Delete from sc where grade < 50
19.删除计算机系VB考试成绩不及格学生的VB选课记录。 Delete from sc
From sc join student s on s.sno = sc.sno Join course c on c.cno = sc.cno where cname = ‘VB’ and grade < 60 and sdept = ‘计算机系’ 20.删除没人选的课程的基本信息。
Delete from course where cno not in( Select cno from course)
21.将“C001”号课程的考试成绩加10分。 Update sc set grade = grade + 10 Where cno = ‘C001’
22.将计算机系所有选修“计算机文化学”课程的学生的成绩加10分。 Update sc set grade = grade + 10
Where sno in(select sno from student where sdept = ‘计算机系’) And cno in(select cno from course where cname = ‘计算机文化学’)
第5章 索引和视图
1. 索引的作用是什么?
答:索引可以加快数据的查询效率。
2.索引分为哪几种类型?分别是什么?它们的主要区别是什么
答:分为聚集索引和非聚集索引两种。聚集索引会对数据进行物理排序,非聚集索引不对数据进行物理排序。
3.在一个表上可以创建几个聚集索引?可以创建多个非聚集索引吗? 答:一个聚集索引。可以。
4.聚集索引一定是唯一性索引,对吗?反之呢? 答:不对。反之也不对。 5.在建立聚集索引时,数据库管理系统是真正将数据按聚集索引列进行物理排序。对吗? 答:对。
6.在建立非聚集索引时,数据库管理系统并不对数据进行物理排序。对吗? 答:对。
7.不管对表进行什么类型的操作,在表上建立的索引越多越能提高操作效率。对吗? 答:不对。
7
8.经常对表进行哪类操作适合建立索引?适合在哪些列上建立索引? 答:适合建立索引的情况:
? ? ? ? ?
包含大量非重复值的列。
使用下列运算符返回一个范围值的查询:BETWEEN AND、>、>=、< 和 <=。 返回大型结果集的查询。
经常被用作联接的列,一般来说,这些列是外键列。
对ORDER BY或GROUP BY子句中指定的列进行索引,可以使数据库管理系统在
查询时不必对数据再进行排序,因而可以提高查询性能。
适合在长度比较短的列上建立索引。
9.使用第4章建立的Student、Course和SC表,写出实现下列操作的SQL语句。 (1)在Student表上为Sname列建立一个聚集索引,索引名为:SnoIdx。 Create clustered index SnoIdx on student(sname)
(2)在Course表上为Cname列建立一个唯一的非聚集索引,索引名为:CNIdx Create index CNIdx on course(cname)
(3)在SC表上为Sno和Cno建立一个组合的聚集索引,索引名为:SnoCnoIdx。 Create clustered index SnoCnoIdx on SC(sno,cno) (4)删除Sname列上建立的SnoIdx索引。
10.试说明使用视图的好处。
答:利用视图可以简化客户端的数据查询语句,使用户能从多角度看待同一数据,可以提高数据的安全性,视图对应数据库三级模式中的外模式,因此提供了一定程度的逻辑独立性。
11.使用视图可以加快数据的查询速度,这句话对吗?为什么?
答:不对,因为通过视图查询数据时,比直接针对基本表查询数据多了一个转换过程,即从外模式到模式的转换。
12.使用第4章建立的Student、Course和SC表,写出创建满足下述要求的视图的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)查询学生的学号、姓名、选修的课程名和考试成绩。 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
8
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
13.利用第12题建立的视图,完成如下查询:
(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
14.修改12题(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
第 6 章 关系数据库规范化理论
1. 关系规范化中的操作异常有哪些?它是由什么引起的?解决的办法是什么? 答:主要有插入异常、删除异常和修改异常,这些都是由数据冗余引起的,解决的办法是进行模式分解,消除数据冗余。
2.第一范式、第二范式和第三范式的关系的定义分别是什么?
答:第一范式:不包含重复组的关系(即不包含非原子项的属性)是第一范式的关系。
第二范式:如果R(U,F)∈1NF,并且R中的每个非主属性都完全函数依赖于主键,则R(U,F)∈2NF。
9
第三范式:如果R(U,F)∈2NF,并且所有的非主属性都不传递依赖于主键,则R(U,F)∈3NF。
3.什么是部分函数依赖?什么是传递函数依赖?请举例说明。
答:部分函数依赖:如果X→Y,并且对于X的一个任意真子集X’有X’→Y成立,则称Y部分函数依赖于X。
传递函数依赖:如果X→Y、Y→Z,则称Z传递函数依赖于X。
例1. 对于关系模式:选课(学号,姓名,课程号,成绩) 该关系模式的主码是(学号,课程号),而有:学号?姓名 因此姓名对主码是部分函数依赖关系。
例2. 对于关系模式:学生(学号,姓名,所在系,系主任) 该关系模式的主码是:学号,由于有:学号?所在系,所在系?系主任 因此系主任对学号是传递函数依赖关系。
4.第三范式的关系模式是否一定不包含部分依赖关系? 答:是。
5.对于主键只由一个属性组成的关系模式,如果它是第一范式关系模式,则它是否一定也是第二范式关系模式? 答:是。
6.设有关系模式:学生修课管理(学号,姓名,所在系,性别,课程号,课程名,学分,成绩)。设一个学生可以选多门课程,一门课程可以被多名学生选。一个学生有唯一的所在系,每门课程有唯一的课程名和学分。请指出此关系模式的候选码,判断此关系模式是第几范式的,若不是第三范式的,请将其规范化为第三范式关系模式,并指出分解后的每个关系模式的主键和外键。
答:候选码:(学号,课程号)
第一范式。因为有:学号?姓名,因此存在部分函数依赖(学号,课程号)p?姓名 第三范式关系模式:
学生(学号,姓名,所在系,性别) 课程(课程号,课程名,学分)
考试(学号,课程号,成绩),学号为引用学生的外键,课程号为引用课程的外键。 7.设有关系模式:学生(学号,姓名,所在系,班号,班主任,系主任),其语义为:一个学生只在一个系的一个班学习,一个系只有一个系主任,一个班只有一名班主任,一个系可以有多个班。请指出此关系模式的候选码,判断此关系模式是第几范式的,若不是第三范式的,请将其规范化为第三范式关系模式,并指出分解后的每个关系模式的主键和外键。 答:候选码:学号
属于第二范式。
但有:学号?班号,班号?班主任,因此存在传递函数依赖:学号传递?班主任。 第三范式关系模式:
学生(学号,姓名,所在系,班号),班号为引用班的外键,所在系为引用系的外键。 班(班号,班主任)系(系名,系主任)
10