-
打开 /home/labex/project 目录下的 answer.sql 文件。
-
在注释下方添加 SQL 语句:
-
找到注释 -- 列出所有没有选修 “Daniel” 老师所授课程的学生姓名。
SELECT s.sname
FROM S s
WHERE NOT EXISTS (
SELECT 1
FROM SC sc
JOIN C c ON sc.cno = c.cno
WHERE c.tname = 'Daniel' AND sc.sno = s.sno
);
这条 SQL 语句首先从 S 表中选择 sname 列。然后使用 NOT EXISTS 子句检查 SC 表中是否存在任何记录,这些记录的课程 ID(cno)与“Daniel”老师所授课程匹配,并且学生 ID(sno)与当前学生匹配。如果不存在这样的记录,学生的姓名将包含在结果中。
-
找到注释 -- 列出在两门或更多课程中不及格(成绩 < 60)的学生学号和姓名。
SELECT s.sno, s.sname
FROM S s
JOIN SC sc ON s.sno = sc.sno
WHERE sc.grade < 60
GROUP BY s.sno, s.sname
HAVING COUNT(sc.sno) >= 2;
这条 SQL 语句首先将 S 表和 SC 表进行连接,以获取学生信息及其课程成绩。然后过滤出成绩小于 60 的记录,按学生学号和姓名进行分组,最后使用 HAVING 子句仅选择在两门或更多课程中不及格的学生。
-
找到注释 -- 列出同时选修了课程 “11” 和课程 “12” 的所有学生姓名。
SELECT s.sname
FROM S s
JOIN SC sc ON s.sno = sc.sno
WHERE sc.cno IN (11, 12)
GROUP BY s.sno
HAVING COUNT(DISTINCT sc.cno) = 2
ORDER BY s.sno;
这条 SQL 语句首先将 S 表和 SC 表进行连接,以获取学生信息及其课程 ID。然后过滤出课程 ID 为 11 或 12 的记录,按学生学号进行分组,并使用 HAVING 子句仅选择同时选修了这两门课程的学生。最后,按学生学号对结果进行排序。
-
找到注释 -- 列出所有在课程 “11” 中的成绩高于课程 “12” 中成绩的学生学号,并按升序排序。
SELECT sc11.sno
FROM SC sc11
JOIN SC sc12 ON sc11.sno = sc12.sno AND sc12.cno = 12
WHERE sc11.cno = 11 AND sc11.grade > sc12.grade
ORDER BY sc11.sno;
这条 SQL 语句首先将 SC 表与自身进行连接,以获取课程 11 和课程 12 的成绩信息。然后过滤出课程 ID 为 11 且成绩高于课程 12 成绩的记录,并选择学生学号。最后,按学生学号对结果进行排序。
-
找到注释 -- 列出所有比 “John Davis” 年龄大的学生姓名。
SELECT s.sname
FROM S s, (SELECT sage FROM S WHERE sname = 'John Davis') AS zs
WHERE s.sage > zs.sage;
这条 SQL 语句首先选择姓名为“John Davis”的学生的年龄值,并将其存储在子查询 zs 中。然后从 S 表中选择年龄(sage)大于“John Davis”年龄的学生的姓名。
-
找到注释 -- 列出所有选修了课程 “12” 的学生中成绩最高的学生学号。
SELECT sc.sno
FROM SC sc
WHERE sc.cno = 12 AND sc.grade = (
SELECT MAX(grade)
FROM SC
WHERE cno = 12
);
这条 SQL 语句首先从 SC 表中选择课程 ID 为 12 且成绩等于选修课程 12 的所有学生中的最高成绩的学生学号。这将给出课程 12 中成绩最高的学生的学号。
-
找到注释 -- 列出所有学生的姓名,以及他们所选课程的课程ID和成绩。
SELECT s.sname, sc.cno, sc.grade
FROM S s
LEFT JOIN SC sc ON s.sno = sc.sno;
这条 SQL 语句在 S 表和 SC 表之间执行左连接,这将包括 S 表中的所有学生,即使他们在 SC 表中没有记录。这将确保所有学生姓名都包含在结果中,以及他们的课程 ID 和成绩(如果有的话)。
-
找到注释 -- 列出选修了四门或更多课程的学生的学号和总成绩(别名:SG),并按总成绩降序排序。
SELECT sc.sno, SUM(sc.grade) AS SG
FROM SC sc
GROUP BY sc.sno
HAVING COUNT(sc.cno) >= 4
ORDER BY SG DESC;
这条SQL语句首先按学生学号(sno)对 SC 表进行分组,并计算每个学生的成绩总和(别名 SG)。然后使用 HAVING 子句过滤结果,仅包括选修了四门或更多课程的学生。最后,按总成绩降序对结果进行排序。