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

答:COUNT(*) 2. 3. 4.

WHERE Sdept NOT IN (‘CS’,’IS’,’MA’),查找的数据是什么? 5.

自连接与普通内连接的主要区别是什么? 6.

外连接与内连接的主要区别是什么? 7.

在使用UNION合并多个查询语句的结果时,对各个查询语句的要求是什么? 8.

相关子查询与嵌套子查询在执行方面的主要区别是什么? 答:各个查询语句的列个数必须相同,对应列的语义相同,类型兼容。

答:自连接中进行连接操作的表在物理上是一张表,而普通内连接进行连接的表在物理上是两张表。 答:查找‘CS’,’IS’,’MA’三个系之外的其他系

WHERE Age BETWEEN 20 AND 30子句,查找的Age范围是多少? 答:Age大于等于20并且小于等于30

在LIKE运算符中“%”的作用是什么? 答:匹配0个或多个字符。

·11· 答:进行外连接的两个表中,可以有一张表不满足连接条件,而进行内连接的两个表必须都满足连接条件。

答:相关子查询的执行过程是先外后内,而嵌套子查询的执行过程是先内后外。而且相关子查询中必须有与外层查询的关联,而嵌套子查询中,内、外层查询之间没有关联关系。

9.

执行SELECT … INOT 表名 FROM …语句时,对表名的要求是什么?

10. 对统计结果的筛选应该使用哪个子句完成? 答:使用HAVING子句

11. 在排序子句中,排序依据列的前后顺序是否重要?ORDER BY C1,C2子句对数据的排序顺序是什么? 答:重要,系统会按列的先后顺序进行排序。

先按C1列进行排序,在C1列值相同时再按C2列进行排序。

12. TOP 子句的作用是什么?

答:在查询结果产生后,提取结果的前若干行数据。

四.上机练习

1.查询学生选课表中的全部数据。 答:select * from SC

2.查询计算机系的学生的姓名、年龄。

答:select sname,sage from student where sdept = '计算机系'

3. 查询成绩在70~80分之间的学生的学号、课程号和成绩。

11

答:必须是一个不存在的新表名。

·12· 答:select sno,cno,grade from sc on where grade between 70 and 80

4. 查询计算机系年龄在18~20之间且性别为“男”的学生的姓名、年龄。 答:select sname,sage from student

where sdept = '计算机系' and sage between 18 and 20 and ssex = '男'

5. 查询“C001”号课程的最高分。

答:select max(grade) from sc where cno = 'C001'

6. 查询计算机系学生的最大年龄和最小年龄。

答:select max(sage) as max_age, min(sage) as min_age from student where sdept = '计算机系'

7. 统计每个系的学生人数。

答:select sdept,count(*) from student group by sdept

8. 统计每门课程的选课人数和考试最高分。

答:select cno, count(*),max(grade) from sc group by cno

9. 统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果。 答:select sno,count(*), sum(grade) from sc group by sno

order by count(*) asc

10. 查询总成绩超过200分的学生,要求列出学号和总成绩。 答:select sno,sum(grade) from sc group by sno

having sum(grade) > 200

11. 查询选课门数超过2门的学生的学号、平均成绩和选课门数。

答:select sno, avg(grade), count(*) from sc having count(*) > 2

12. 查询选了“C002”课程的学生的姓名和所在系。

答:select sname,sdept from student s join sc on s.sno = sc.sno where cno = 'C002'

13. 查询成绩80分以上的学生的姓名、课程号和成绩,并按成绩降序排列结果。

答:select sname,cno,grade from student s join sc on s.sno = sc.sno where grade > 80 order by grade desc

14. 查询计算机系男生修了“数据库基础”的学生的姓名、性别和成绩。

答:select sname,ssex,grade from student s join sc on s.sno = sc.sno join course c on c.cno = sc.cno

where sdept = '计算机系' and ssex = '男' and cname = '数据库基础'

15. 查询学生的选课情况,要求列出每位学生的选课情况(包括未选课的学生),并列出学生的学号、姓名、课程号

和考试成绩。

12

答:select s.sno,sname,cno,grade from student s

left join sc on s.sno = sc.sno

16. 查询哪些课程没有人选,要求列出课程号和课程名。

答:select c.cno,cname from course c left join sc on c.cno = sc.cno

where sc.cno is null

17.查询计算机系没有选课的学生,列出学生姓名。

答:select sname from student s left join sc on s.sno = sc.sno Where sdept = '计算机系' and sc.sno is null

18. 列出“数据库基础”课程考试成绩前三名的学生的学号、姓名、所在系和考试成绩。 答:select top 3 s.sno, sname, sdept, grade from Student s join SC on s.Sno = SC.Sno join Course c on c.Cno = SC.Cno where cname = '数据库基础' order by grade desc

19.查询VB考试成绩最低的学生的姓名、所在系和VB成绩。

答:select top 1 with ties sname,sdept,grade from student s join sc on s.sno = sc.sno join course c on c.cno = sc.cno where cname = 'VB' order by grade asc

·13· 20. 查询有考试成绩的所有学生的姓名、修课名称及考试成绩,要求将查询结果放在一张新的永久表中,假设新表

名为new_sc。

答:select sname, cname, grade into new_sc from student s join sc on s.sno = sc.sno join course c on c.cno = sc.cno where grade is not null

21. 分别查询信息管理系和计算机系的学生的姓名、性别、修课名称、修课成绩,并要求将这两个查询结果合并成

一个结果集,并以系名、姓名、性别、修课名称、修课成绩的顺序显示各列。

答:select sdept 系名, sname 姓名, ssex 性别, cname 修课名称, grade 修课成绩 from student s join sc on s.sno=sc.sno join course c on c.cno=sc.cno where sdept = '信息管理系'

UNION

select sdept , sname, ssex, cname, grade from student s join sc on s.sno=sc.sno join course c on c.cno=sc.cno where sdept = '计算机系'

22.查询选了VB的学生学号、姓名、所在系和成绩,并对所在系进行如下处理:

13

·14· 当所在系为“计算机系”时,显示“CS”; 当所在系为“信息管理系”时,显示“IS”; 当所在系为“通信工程系”时,显示“CO”;

对其他系,均显示“OTHER”。

答:select s.sno 学号,sname 姓名, case sdept when '计算机系' then 'CS' when '信息系' then 'IS' when '数学系' then 'CO' else 'OTHER'

end as 所在系,grade 成绩

from student s join sc on s.sno = sc.sno join course c on c.cno = sc.cno where cname = 'vb'

23. 用子查询实现如下查询:

(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 sno in( select sno from sc where grade > 80) and sdept = '通信工程系'

(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 and ssex = '男') and ssex = '男'

(5)查询“C001”课程的考试成绩高于“C001”课程的平均成绩的学生的学号和“C001”课程成绩。 答:select sno,grade from sc where cno = ' C001'

And grade > (select avg(grade) from sc where cno = ' C001')

24. 创建一个新表,表名为test_t,其结构为:(COL1, COL 2, COL 3),其中:

COL1:整型,允许空值。

COL2:字符型,长度为10 ,不允许空值。 COL3:字符型,长度为10 ,允许空值。

试写出按行插入如下数据的语句(空白处表示空值)。

14

COL1 1 2 COL1 int,

COL2 char(10) not null, COL3 char(10) )

insert into test_t values(NULL, 'B1', NULL) insert into test_t values(1, 'B2', 'C2') insert into test_t(COL1, COL2) values(2, 'B3')

25. 将 “C001”课程的考试成绩加10分。

答:update sc set grade = grade + 10 where cno = 'C001'

B1 B2 B3 COL2 C2 COL3 ·15· 答:create table test_t (

26. 将计算机系所有选修了“计算机文化学”课程的学生成绩加10分,分别用子查询和多表连接形式实现。 答:(1)子查询

update sc set grade = grade + 10 where sno in(

select sno from student where sdept = '计算机系') and cno in(

select cno from course where cname = '计算机文化学')

(2)多表连接

update sc set grade = grade + 10

from sc join student s on sc.sno = s.sno join course c on c.cno = sc.cno

where sdept = '计算机系' and canem = '计算机文化学'

27. 删除修课成绩小于50分的学生的选课记录。 答:delete from sc where grade < 50

28. 删除信息管理系考试成绩小于50分的学生的该门课程的修课纪录,分别用子查询和多表连接形式实现。 答:(1) 用连接查询实现

delete from sc from sc join student s on s.sno=sc.sno where sdept = '信息管理系' and grade < 50 (2)用子查询实现

delete from sc where sno in (

select sno from student where sdept = '信息管理系' ) and grade < 50

29.删除VB考试成绩最低的学生的VB修课记录。 答:delete from sc

15