《数据库原理与应用》(第三版) 第 6 章 数据操作语句 基础 习题参考答案

1.简单说明SELECT语句中,FROM、WHERE、GROUP BY、HAVING子句的作用。
答:FROM子句指定数据来自的表,WHERE子句指定行数据的筛选条件,GROUP BY子句指定用于分组的列,HAVING子句用于对分组后的统计值进行筛选。

2.简单说明COUNT()与COUNT(列名)的区别。
答:COUNT(
)用于统计行的个数,并且不忽略NULL;COUNT(列名)用于统计该列中非空值个数,这个函数会去掉NULL。

3.在聚合函数中,不忽略空值的函数是哪个?
答:COUNT(*)

4.哪些数据类型的列可以使用SUM(列名)和AVG(列名)函数?
答:数值类型的列

5.外连接和内连接的区别是什么?
答:外连接结果会包含连接中一个表的全部数据,内连接结果是只包含两个表中满足连接条件的数据。

6.TOP子句的作用是什么?
答:限定取查询结果中的前若干行数据。

7.DISTINCT子句的作用是去掉表中的重复行数据,这个说法对吗?
答:应该是去掉查询结果中的重复行数据。

8.简单说明嵌套子查询的执行顺序。
答:嵌套子查询是先执行子查询,然后在根据子查询结果执行外层查询。

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

2.查询计算机系的学生姓名、年龄。
答:select sname, sage from student where sdept = ‘计算机系’

3.查询成绩在70~80分之间的学生学号、课程号和成绩。
答:select sno,cno,grade from sc
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.查询“c01”课程最高分。
答:select max(grade) from sc where cno = ‘C01’

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 sno,count() 选课门数, sum(grade) 考试总成绩
from sc
group by sno
order by count(
) asc

9.查询总成绩超过200分的学生,列出学号、总成绩。
答:select sno,sum(grade) 总成绩 from sc
group by sno
having sum(grade) > 200

10.查询选了“c02”课程的学生姓名和所在系。
答:select sname,sdept
from student s join sc on s.sno = sc.sno
where cno = ‘C02’

11.查询成绩80分以上的学生姓名、课程号和成绩,并按成绩降序排列结果。
答:select sname,cno,grade
from student s join sc on s.sno = sc.sno
where grade > 80 order by grade desc

12.查询哪些学生没有选课,要求列出学号、姓名和所在系。
答:select s.sno, sname, sdept
from student s left join sc on s.sno = sc.sno
Where sc.sno is null

13.统计每门课程的选课人数,列出课程号和选课人数。( 包括没人选的课程)
答:select c.cno,count(sc.cno) 选课人数
from course c left join sc on c.cno = sc.cno
Group by c.cno

14.查询与VB在同一学期开设的课程的课程名和开课学期。
答:select c2.cname,c2.semester
from course c1 join course c2 on c1.semester = c2.semester
Where c1.cname = ‘VB’ and c1.cname != ‘VB’

15.查询与李勇年龄相同的学生的姓名、所在系和年龄。
答:select S2.Sname,S2.Sdept, S2.sage
from student s1 join student s2 on s1.sage = s2.sage
Where s1.sname = ‘李勇’ and s2.sname != ‘李勇’

16.查询计算机系年龄最小的2名学生的姓名和年龄。
答:select top 2 with ties sname, sage
from student
Where sdept = ‘计算机系’
Order by sage asc

17.查询VB成绩最高的前2名学生的姓名、所在系和VB成绩,包括并列的情况。
答:select top 2 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 desc

18.查询选课门数最多的前2名学生的学号和选课门数,包括并列的情况。
答:select top 2 with ties sno, count() 选课门数
from sc
Group by sno
Order by count(
) desc

19.查询学生人数最多的系,列出系名和人数。
答:select top 1 with ties sdept, count() 人数
from student
Group by sdept
Order by count(
) desc

20.用子查询实现如下查询:
(1) 查询选修了“c01”号课程的学生姓名和所在系。
答:select sname, sdept from student where sno in(
select sno from sc where cno = ’ C01’)

(2) 查询数学系成绩80分以上的学生学号、姓名、课程号和成绩。
答:select sno,sname,cno,grade
from student s join sc on s.sno = sc.sno
where s.sno in(
select sno from sc where grade > 80)
and sdept = ‘数学系’

(3) 查询计算机系考试成绩最高的学生姓名。
答:select sname from student
where sno in(
select top 1 sno from sc join student s on s.sno = sc.sno
where sdept = ‘计算机系’
Order by grade desc )

(4) 查询数据结构考试成绩最高的学生姓名、所在系、性别和成绩。
答:select sname,sdept,ssex,grade
from student s join sc on s.sno = sc.sno
where s.sno in(
Select top 1 sno from sc join course c on c.cno = sc.cno
Where cname = ‘数据结构’
Order by grade desc )

21.查询没选VB课程的学生姓名和所在系。
答:select sname,sdept from student
Where sno not in (
Select sno from sc join course c on c.cno = sc.cno
Where cname = ‘VB’ )

22.查询计算机系没选课的学生的姓名和性别。
答:select sname,ssex from student
Where sdept = ‘计算机系’
And sno not in (
Select sno from sc )

23.查询计算机系考试平均成绩最低的学生的姓名及所选的课程名。
答:select sname,cname from student s join sc on s.sno = sc.sno
Join course c on c.cno = sc.cno
where s.sno in (
Select top 1 sno from sc
Where sdept = ‘计算机系’
Group by sno
Order by avg(grade) asc )

24.查询1~5学期中,选课人数最少的课程的课程名、开课学期和学分。
答:select cname,semester,credit from course
Where semester between 1 and 5
And cno in (
Select top 1 cno from sc
Group by cno
Order by count(*) desc )

25.查询计算机系每个学生的考试情况,列出姓名、课程名和考试成绩,并将查询结果保存到一个新表中。新表名为:Computer_Dept
答:select sname,cname,grade into Computer_Dept
from student s join sc on s.sno = sc.sno
Join course c on c.cno = sc.cno
Where sdept = ‘计算机系’

26.创建一个新表,表名为test_t,其结构为:(COL1, COL 2, COL 3),其中:
COL1:整型,允许空值。
COL2:普通编码字符型,长度为10 ,不允许空值。
COL3:普通编码字符型,长度为10 ,允许空值。
试写出按行插入如下数据的语句(空白处表示空值)。
COL1 COL2 COL3
B1
1 B2 C2
2 B3
答:create table test_t(
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 values(2,‘B3’’,null)

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

28.删除没有人选的课程。
答:delete from course where cno not in(
Select cno from sc )

29.删除计算机系VB成绩不及格学生的VB选课记录。
答:delete from sc
From student s join sc on s.sno = sc.cno
Join course c on c.cno = sc.cno
where sdept = ‘计算机系’ and cname = ‘VB’
and grade < 60

30.删除VB考试成绩最低的学生的VB选课记录。
答:delete from sc
From course c join sc on c.cno = sc.cno
Where cname = ‘VB’
And grade = (
Select min(grade) from sc
Join course c on c.cno = sc.cno
Where cname = ‘VB’)

31.将第2学期开设的所有课程的学分增加2分。
答:update course set credit = credit + 2
Where semester = 2

32.将VB课程的学分改为3分。
答:update course set credit = 3
Where cname = ‘VB’

33.将计算机系学生的年龄增加1岁。
答:update student set sage = sage + 1
where sdept = ‘计算机系’

34.将信息系学生的“计算机文化学”课程的考试成绩加5分。
答:update sc set grade = grade + 5
From student s join sc on s.sno = sc.sno
Join course c on c.cno = sc.cno
Where sdept = ‘信息系’
And cname = ‘计算机文化学’

35.将选课人数最少的课程的学分降低1分。
答:update course set credit = credit - 1
Where cno in (
Select top 1 cno from sc
Group by cno
Order by count(*) asc )

发布了750 篇原创文章 · 获赞 471 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/105500473