70 分钟上机练习:参考答案与详解

这一页与题目页分开,包含每一道题的 参考 SQL、运行结果、简要解析,方便课后核对与讲评。

使用方式
  • 先对照自己的 SQL 看整体思路是否一致
  • 再看运行结果是否与自己的结果相同
  • 若写法不同,但结果与逻辑正确,也可以接受
说明
  • 以下答案以题目页提供的模拟数据为准
  • 个别题给出了等价写法或补充检查语句
  • 若数据库排序不同,显示顺序可能略有差异
答案页 含详解 含运行结果
答案总览

这套答案与前面两份知识点学习页保持同一主题线:先区分 单值 / 多值 / 相关子查询 / EXISTS,再区分 UNION 与连接查询。若学生出现共性问题,通常集中在以下三个点:子查询方向写反、UNION 两边列结构不一致、把 UNION 和 JOIN 混淆。

10
共收录答案
6
子查询相关题
4
UNION 相关题
1
UPDATE 提升题

参考答案

1
单值子查询:比赵琳琳年龄大的学生
SQL
SELECT sno, sn, age FROM s WHERE age > ( SELECT age FROM s WHERE sn = '赵琳琳' ) ORDER BY age, sno;
运行结果
snosnage
s3王敏20
s4陈晨21
s6周楠22
解析:子查询先查出赵琳琳的年龄 19,外层再筛选 age > 19 的学生。
2
多值子查询:查询 s2 选修的课程信息
SQL
SELECT cno, cn, ct FROM c WHERE cno IN ( SELECT cno FROM sc WHERE sno = 's2' ) ORDER BY cno;
运行结果
cnocnct
c1程序设计基础64
c2数据库原理48
解析:sc 表先返回 s2 的课程号集合 {c1, c2},外层再到 c 表中取出这两门课的完整信息。
3
多值子查询:比计算机专业所有教师工资都高
SQL
SELECT tno, tn, maj, sal FROM t WHERE sal > ALL ( SELECT sal FROM t WHERE maj = '计算机' ) AND maj <> '计算机';
补充:
等价写法:
SELECT tno, tn, maj, sal
FROM t
WHERE sal > (
    SELECT MAX(sal)
    FROM t
    WHERE maj = '计算机'
)
AND maj <> '计算机';
运行结果
tnotnmajsal
t4刘芳英语7000
解析:计算机专业教师工资为 5200、6800、6100。要比“所有人都高”,本质上就是要大于最大值 6800。
4
相关子查询:查询选修 c1 的学生
SQL
SELECT sno, sn FROM s WHERE 'c1' IN ( SELECT cno FROM sc WHERE sno = s.sno ) ORDER BY sno;
运行结果
snosn
s1张三
s2赵琳琳
s3王敏
s6周楠
解析:这是相关子查询。外层每取到一个学生,内层就会查询“这个学生选了哪些课”,再判断其中是否包含 c1。
5
NOT EXISTS:查询没有选修 c1 的学生
SQL
SELECT sno, sn FROM s WHERE NOT EXISTS ( SELECT * FROM sc WHERE sno = s.sno AND cno = 'c1' ) ORDER BY sno;
运行结果
snosn
s4陈晨
s5李雪
解析:NOT EXISTS 的含义是:找不到“该学生选了 c1”这条记录。满足条件的只有 s4 和 s5。
6
EXISTS:查询 t1 教授的课程信息
SQL
SELECT cno, cn, ct FROM c WHERE EXISTS ( SELECT * FROM tc WHERE cno = c.cno AND tno = 't1' ) ORDER BY cno;
运行结果
cnocnct
c1程序设计基础64
c2数据库原理48
解析:外层从课程表 c 逐行判断,只要 tc 表中存在“当前课程由 t1 讲授”的记录,这门课就会被保留。
7
UNION:合并两个专业的学生信息
SQL
SELECT sno, sn, maj FROM s WHERE maj = '计算机' UNION SELECT sno, sn, maj FROM s WHERE maj = '数学';
运行结果
snosnmaj
s1张三计算机
s2赵琳琳数学
s3王敏计算机
s5李雪数学
s6周楠计算机
解析:两边都来自学生表,且都返回 3 列,结构一致,所以可以直接用 UNION 纵向合并。
8
UNION:合并两门课程的统计结果
SQL
SELECT cno AS 课程号, SUM(score) AS 总分, AVG(score) AS 平均分 FROM sc WHERE cno = 'c1' GROUP BY cno UNION SELECT cno AS 课程号, SUM(score) AS 总分, AVG(score) AS 平均分 FROM sc WHERE cno = 'c2' GROUP BY cno;
运行结果
课程号总分平均分
c134887.00
c233583.75
解析:c1 的成绩为 86、88、79、95,总分 348,平均分 87。c2 的成绩为 90、92、69、84,总分 335,平均分 83.75。
9
UNION 去重观察题
SQL
SELECT sno, sn FROM s WHERE maj = '计算机' UNION SELECT sno, sn FROM s WHERE age >= 20 ORDER BY sno;
运行结果
snosn
s1张三
s3王敏
s4陈晨
s6周楠
解析:s3 和 s6 同时满足“计算机专业”和“年龄 >= 20”,但在 UNION 结果中各只保留一行,这正好说明 UNION 会自动去重。
10
综合题:子查询 + UNION
SQL
SELECT sno, sn, maj FROM s WHERE NOT EXISTS ( SELECT * FROM sc WHERE sno = s.sno AND cno = 'c1' ) UNION SELECT sno, sn, maj FROM s WHERE maj = '英语' ORDER BY sno;
运行结果
snosnmaj
s4陈晨英语
s5李雪数学
解析:前半部分得到没有选 c1 的学生 s4、s5;后半部分得到英语专业学生 s4。两部分用 UNION 合并后,重复的 s4 只保留一次。