《数据库原理与应用》(第三版)书后上机练习题——第六章
书上给的三个表的数据
题目错误的地方
- 所有关于VB课的题目,这里可以选择把表中的Java课改成VB课,或者把题目中的VB课改为Java课
- 我这里是把题目中的VB课改为Java课来写的
- 18题: 查询选课人数最多的前两名学生的学号和选课门数,包括并列的情况。
- 这里不通顺应该是: 选课门数最多的前两名学生
答案
题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) AS c01的最高分 FROM SC WHERE Cno = 'c01'
题6.查询计算机系学生的最大年龄和最小年龄。
SELECT MAX(Sage) AS 计算机系的最大年龄,MIN(Sage) AS 计算机系的最小年龄 FROM Student
WHERE Sdept = '计算机系'
题7.统计每个系的学生人数。
SELECT Sdept,COUNT(*) AS 学生人数 FROM Student GROUP BY Sdept
题8.统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果(不包括没选课的学生)。
SELECT Sno,COUNT(*) AS 选课门数,SUM(Grade) AS 总成绩 FROM sc GROUP BY Sno
ORDER BY COUNT(*) ASC
题9.查询总成绩超过200分的学生,列出学号、总成绩。
SELECT Sno,SUM(Grade) AS 总成绩 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.Cno is NULL
题13.统计每门课程的选课人数,列出课程号和选课人数(包括没人选的课程)。
SELECT C.Cno,COUNT(SC.Sno) AS 选课人数 FROM Course C LEFT JOIN SC
ON C.Cno = SC.Cno GROUP BY C.Cno
题14.查询与"VB""Java"在同一学期开设的课程的课程名和开课学期。
/*题目应该是 查询与“Java"在同一学期开设的课程的课程名和开课学期。*/
SELECT Cname,Semester FROM Course
WHERE Semester IN (
SELECT Semester FROM Course WHERE Cname='Java')
题15.查询与李勇年龄相同的学生的姓名、所在系和年龄。
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage IN (
SELECT Sage FROM Student WHERE Sname='李勇')
题16.查询计算机系年龄最小的两名学生的姓名和年龄。
SELECT TOP 2 WITH TIES Sname,Sage FROM Student
WHERE Sdept='计算机系'
ORDER BY Sage ASC
题17.查询"VB"“Java"成绩最高的前两名学生的姓名、所在系和"VB”"Java"成绩,包括并列的情况。
/*题目应该是 查询Java成绩最高的前两名学生的姓名,所在系和Java成绩,包括并列情况*/
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 = 'Java'
ORDER BY Grade DESC
题18.查询选课人数门数最多的前两名学生的学号和选课门数,包括并列的情况。
/*题目应该是 查询选课门数组多的前两名学生的学号和选课门数,包括并列情况*/
SELECT TOP 2 WITH TIES Sno,COUNT(*) AS 选课门数
FROM SC GROUP BY Sno ORDER BY COUNT(*) DESC
题19.查询学生人数最多的系,列出系名和人数。
SELECT TOP 1 Sdept,COUNT(*) AS 人数 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 Student.Sno,Sname,Cno,Grade FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Student.Sno IN(SELECT Sno FROM Student WHERE Sdept = '数学系')
AND SC.Sno IN(SELECT Sno FROM SC WHERE Grade > 80)
(3)查询计算机系考试成绩最高的学生姓名。
SELECT Sname FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept = '计算机系' AND Grade = (SELECT MAX(Grade) FROM
SC JOIN Student ON SC.Sno=Student.Sno WHERE Sdept = '计算机系')
(4)查询数据结构考试成绩最高的学生姓名、所在系、性别和成绩。
SELECT Sname,Sdept,Ssex,Grade FROM Student
JOIN SC ON Student.Sno=SC.Sno
JOIN Course ON SC.Cno=Course.Cno
WHERE Cname='数据结构' AND Grade=(SELECT MAX(Grade)
FROM SC JOIN Course ON SC.Cno=Course.Cno WHERE Cname='数据结构')
题21.查询没选"VB""Java"课程的学生姓名和所在系。
/*题目应该是 查询没选“Java*课程的学生姓名和所在系*/
SELECT Sname,Sdept FROM Student
WHERE Sno IN(SELECT Sno FROM SC JOIN Course ON SC.Cno = Course.Cno
WHERE Cname != 'Java')
题22.查询计算机系没有选课的学生的姓名和性别。
SELECT Sname,Ssex FROM Student
LEFT JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept='计算机系' AND SC.Sno IS NULL
题23.查询计算机系考试平均成绩最低的学生的姓名以及所选的课程名。
SELECT Sname,Cname FROM Student
JOIN SC ON Student.Sno=SC.Sno
JOIN Course ON SC.Cno=Course.Cno
WHERE Student.Sno IN
(SELECT TOP 1 WITH TIES Student.Sno
FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept='计算机系'
GROUP BY Student.Sno ORDER BY AVG(Grade) ASC)
题24.查询1 ~ 5学期中,选课人数最少的课程的课程名、开课学期和学分。
SELECT Cname,Semester,Credit FROM Course
WHERE Cno IN
(SELECT TOP 1 WITH TIES Cno FROM SC
WHERE Cno IN
(SELECT Cno FROM Course
WHERE Semester
BETWEEN 1 AND 5)
GROUP BY Cno ORDER BY COUNT(Sno)
)
/*对1到5学期的课程号进行分组,根据学生数量排序(就是选课人数)*/
题25.查询计算机系每个学生的考试情况,列出姓名、课程名和考试成绩,并将查询结果保存到一个新表中。新表名为: Computer_Dept。
/*查询计算机系每个学生的考试情况,列出姓名、课程名和考试成绩,并将查询结果保存到一个新表中。新表名为: Computer_Dept*/
SELECT Sname,Cname,Grade INTO Computer_Dept
FROM Student
LEFT JOIN SC ON Student.Sno=SC.Sno
LEFT JOIN Course ON SC.Cno=Course.Cno
WHERE Sdept='计算机系'
题26.创建一个新表,表名为test _t,其结构为(COLI, COL2, COL3),其中:
CREATE TABLE test_t(
COL1 int,
COL2 char(10) not NULL,
COL3 char(10)
)
INSERT INTO test_t(COL2) VALUES('B1')
INSERT INTO test_t(COL1,COL2,COL3) VALUES(1,'B2','C2')
INSERT INTO test_t(COL1,COL2) VALUES(2,'B3')
题27.删除考试成绩低于50分的学生的选课记录。
DELETE FROM SC WHERE Grade < 50
没有低于50分的
题28.删除没有人选的课程。
DELETE FROM Course
WHERE Cno NOT IN(SELECT Cno FROM SC)
删了两个课程 c03计算机网路,c08离散数学
题29.删除计算机系"VB"“Java"成绩不及格学生的"VB”"Java"选课记录。
DELETE FROM SC
FROM SC JOIN Student ON Student.Sno=SC.Sno
JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java' AND Grade < 60 AND Sdept='计算机系'
没有不及格的
题30.删除"VB"“Java"考试成绩最低的学生的"VB”"Java"选课记录。
DELETE FROM SC
FROM SC JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java' AND Grade=(
SELECT MIN(Grade) FROM SC
JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java')
删除了9521103 c02 68 这条记录
题31.将第2学期开设的所有课程的学分增加2分。
UPDATE Course SET Credit=Credit+2
WHERE Semester=2
高等数学学分从8变为10
题32.将VBJava课程的学分改为3分。
UPDATE Course SET Credit=3
WHERE Cname='Java'
题33.将计算机系学生的年龄增加1岁。
UPDATE Student SET Sage=Sage+1
WHERE Sdept='计算机系'
题34.将信息系学生的“计算机文化学”课程的考试成绩加5分。
UPDATE SC SET Grade=Grade+5
FROM SC JOIN Course ON Course.Cno=SC.Cno
JOIN Student ON SC.Sno=Student.Sno
WHERE Sdept = '信息系' AND Cname='计算机文化学'
9521102 c01 分数从82变为87
题35.将选课人数最少的课程的学分降低1分。
UPDATE Course SET Credit=Credit-1
WHERE Cno IN (
SELECT TOP 1 WITH TIES Cno
FROM SC GROUP BY Cno
ORDER BY COUNT(Sno) ASC)
数据库基础、数据结构、操作系统的学分从4、5、4变为3、4、3
如有大佬发现错误,还请指正,感谢!