MySQL查询检索直A学生的姓名

Aus*_*ion 0 mysql sql

我首先要说这是家庭作业,我不是在寻找解决方案。我只是在寻找有关我已经尝试过的内容的确认/提示。基本上,有表:

学生(姓名,学生编号,班级,专业)

GRADE_REPORT(Student_number, Section_identifier, Grade)

我需要检索所有 A 级学生(所有课程成绩为 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)
Run Code Online (Sandbox Code Playgroud)

同样,只寻找有关编写查询的确认和提示。我对编写查询很陌生,但对其背后的逻辑仍然有些困惑。

Jua*_*eza 5

对此有不同的方法。

在你的尝试中。您的第一部分不需要JOIN. 您正在带学生和过滤您不想要的学生的地方。如果你仔细看,你会意识到不要使用GRADE_REPORT桌子上的任何东西。

SELECT Name, Major
FROM STUDENT s JOIN GRADE_REPORT g
        ON s.Student_number = g.Student_number
Run Code Online (Sandbox Code Playgroud)

但即使有了这个附加值,也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 
Run Code Online (Sandbox Code Playgroud)

现在在这里你加入两个表并使用 aCONDITIONAL COUNT来查看有多少学生成绩没有'A',并且只会返回那些有 0 的成绩

优点是去除子查询提高整体性能