【问题标题】:select info of students that got A on all their exams选择在所有考试中获得 A 的学生的信息
【发布时间】:2020-04-27 22:26:07
【问题描述】:

我有三张桌子:

STUDENT
Studentid (pk) | Lastname | Firstname

SUBJECT
Subjectcode (pk) | Subjectyear (pk) | Subjectname

EXAM
Studentid (pk, fk) | Subjectcode (pk, fk) | Subjectyear(pk, fk) | Grade

我需要创建一个 select 语句,返回所有在其科目考试中仅获得 A 级的学生的 Studentid、Lastname 和 Firstname。 因此,假设某个学生参加了三个不同科目的考试并获得了 A、B 和 A,那么他们不应该包含在结果中。 如果另一个学生参加了两门不同科目的两次考试并获得 A 和 A,则他们必须包含在结果中。

【问题讨论】:

    标签: mysql sql join select group-by


    【解决方案1】:

    一种选择是聚合:

    select st.studendid, st.lastname, st.firstname
    from student st
    inner join exam ex on ex.studendid = st.studendid
    group by st.studendid, st.lastname, st.firstname
    having min(ex.grade) = max(ex.grade) and min(ex.grade) = 'A'
    

    实际上,假设'A' 是按字母顺序排列的最低等级,having 子句可以简化为:

    having max(ex.grade) = 'A'
    

    请注意,您不需要subject 表来获得您正在寻找的结果。

    【讨论】:

      【解决方案2】:

      假设所有学生至少有 1 门考试,那么您可以使用NOT EXISTS

      select s.* from student s
      where not exists (
        select 1 from exam
        where studentid = s.studentid and grade <> 'A'
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 2020-10-13
        相关资源
        最近更新 更多