需要帮助编写SQL查询(连接,子查询)

时间:2016-11-06 00:07:25

标签: mysql sql database

鉴于以下架构,我应该为问题编写查询。

我的第一个查询运行但没有结果,第二个查询出现subquery returns more than one row错误。

student (sid, sname, sex, birthdate, gpa)
prof (pname, dname)
course (cnum, dname, cname)
section (cnum, secnum, pname)
enroll (sid, cnum, secnum, grade)
  1. 对于每门课程,返回部分的数量(numsections),注册的学生总数(numstudents),平均成绩(avggrade),以及教授课程的不同教授的数量(numprofs)。仅展示化学或计算机科学系的课程。即使没有学生,也一定要出示课程。如果没有教授该课程的教授,请不要展示课程。

  2. 返回至少两门课程的成绩高于课程平均成绩的学生。按课程数量排序高于平均数,仅显示前5名。

  3. SQL查询:

    SELECT C.cnum, C.cname, COUNT(*) AS numsections, COUNT(E.sid) AS numstudents, 
    AVG(E.grade) AS avggrade, COUNT(P.pname) AS numprofs
    FROM course C 
        JOIN section S ON C.cnum = S.cnum
        JOIN enroll E ON C.cnum = E.cnum
        JOIN prof P ON S.pname = P.pname
    WHERE C.cname = 'Chemistry' OR C.cname = 'Computer Science'
    GROUP BY C.cnum, C.cname;`
    
    
    SELECT S.sid, S.sname
    FROM student S 
         LEFT JOIN enroll E ON S.sid = E.sid
    WHERE E.grade > (SELECT AVG(grade)
                    FROM course C JOIN enroll E2
                    ON C.cnum = E2.cnum
                    GROUP BY C.cnum
                    LIMIT 5);`
    

1 个答案:

答案 0 :(得分:0)

关于第二个查询...

您的子查询获得的行数超过1行。使用"<"你需要确定你只带了一行而且只有一列。

如果我理解正确的话,你只需按照优于课程平均数的次数来显示排名前5位的学生。我认为这是一个学习的例子,所以如果我给你的话它就不会有帮助查询..

您需要选择前5名学生,但要知道您必须 COUNT() GRADE 大于的次数AVG()他们所选择的每门课程,在您的子查询中的某个时刻,您应该按照他们达到平均值的次数来排序学生。