鉴于以下架构,我应该为问题编写查询。
我的第一个查询运行但没有结果,第二个查询出现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)
对于每门课程,返回部分的数量(numsections),注册的学生总数(numstudents),平均成绩(avggrade),以及教授课程的不同教授的数量(numprofs)。仅展示化学或计算机科学系的课程。即使没有学生,也一定要出示课程。如果没有教授该课程的教授,请不要展示课程。
返回至少两门课程的成绩高于课程平均成绩的学生。按课程数量排序高于平均数,仅显示前5名。
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);`
答案 0 :(得分:0)
关于第二个查询...
您的子查询获得的行数超过1行。使用"<"你需要确定你只带了一行而且只有一列。
如果我理解正确的话,你只需按照优于课程平均数的次数来显示排名前5位的学生。我认为这是一个学习的例子,所以如果我给你的话它就不会有帮助查询..
您需要选择前5名学生,但要知道您必须 COUNT() GRADE 大于的次数AVG()他们所选择的每门课程,在您的子查询中的某个时刻,您应该按照他们达到平均值的次数来排序学生。