首先我会说这是家庭作业,我不是在寻找解决方案。我只是在寻找关于我已经尝试过的东西的确认/提示。基本上,有表格:
学生(姓名、学号、类(class)、专业)
GRADE_REPORT(学号,Section_identifier,年级)
我需要检索所有 straight-A 学生(所有类(class)成绩均为 A 的学生)的姓名和主要院系。
这是我想出的:
SELECT Name, Major
FROM STUDENT s JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
WHERE NOT EXISTS
(SELECT Grade
FROM GRADE_REPORT
WHERE Grade <> ‘A’
AND Student_number = s.Student_number)
同样,只寻找有关编写查询的确认和提示。我对编写查询还很陌生,对其背后的逻辑仍然有些困惑。
最佳答案
有不同的方法。
在你的尝试中。您的第一部分不需要 JOIN
.您正在带学生和 where 过滤器您不想要的学生。如果你仔细看,你会发现不要使用 GRADE_REPORT
中的任何东西。表。
SELECT Name, Major
FROM STUDENT s JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
但即使有那个额外的 JOIN
应该会带给您想要的结果。
现在更好的解决方案是使用 JOIN
并使用 GROUP BY
+ HAVING
筛选学生
SELECT Name, Major
FROM STUDENT s
JOIN GRADE_REPORT g
ON s.Student_number = g.Student_number
GROUP BY Name, Major
HAVING COUNT(CASE WHEN g.Grade <> 'A' THEN 1 END) = 0
现在在这里加入两个表并使用 CONDITIONAL COUNT
看看有多少学生的成绩不是'A'
, 并且只返回 0
优点是去除子查询提高整体性能
关于MySQL查询检索全优学生姓名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715511/