MySQL查询检索全优学生姓名

标签 mysql sql

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

学生(姓名、学号、类(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/

相关文章:

php - PDO INSERT准备好的语句,没有错误,但未插入数据

sql - 什么会导致合法的 MySql INSERT INTO 命令失败?

MySql:设置一个带有列表的变量

sql - 数据库中的非拉丁字符排序为 "order by"

sql - 过去 12 个月和单个月份的列数

sql - 以下更新命令中的语法错误

mysql - 将 m2m 更改为 char 时 Django South 迁移失败

mariadb 阻止 mysql 服务器安装

php - 带哈希的 SQL LIKE 运算符

sql - 是 CRUD DDL 还是 DML 操作?