在MySQL中,现有评分表evaluate(包含班级编号cid和分数point字段),有班级表grade(包含班级编号cid等字段), 查询evaluate 表中有没有班级均分大于等于80分的,如果存在,则查询显示grade表按cid由大到小排名的前五行记录,下列语句正确的是()
在MySQL中,现有评分表evaluate(包含班级编号cid和分数point字段),有班级表grade(包含班级编号cid等字段), 查询evaluate 表中有没有班级均分大于等于80分的,如果存在,则查询显示grade表按cid由大到小排名的前五行记录,下列语句正确的是()
SELECT * FROM grade
WHERE EXISTS (
SELECT cid,AVG(point) AS avg
FROM evaluate GROUP BY cid
HAVING avg>=80)
ORDER BY grade.cid;
SELECT * FROM grade
WHERE EXISTS (
SELECT cid,AVG(point) AS avg
FROM evaluate GROUP BY cid
HAVING avg>=80)
ORDER BY grade.cid DESC LIMIT 5 ;
SELECT * FROM grade
WHERE EXISTS (
SELECT AVG(point) AS avg
FROM evaluate GROUP BY cid
HAVING avg>=80)
ORDER BY grade.cid DESC LIMIT 5 ;
SELECT * FROM grade
WHERE EXISTS (
SELECT cid,AVG(point) AS avg
FROM evaluate
WHERE avg>=80)
ORDER BY grade.cid DESC LIMIT 5 ;
SELECT * FROM grade WHERE EXISTS ( SELECT cid FROM evaluate WHERE grade.cid = evaluate.cid GROUP BY cid HAVING AVG(point) >= 80 ) ORDER BY grade.cid DESC LIMIT 5;
A语句不正确,因为它没有限制结果只输出前五条记录。
B语句正确,它使用了EXISTS关键字来判断是否有班级均分大于等于80分,如果存在则显示grade表中cid由大到小排名的前五行记录。
C语句不正确,因为它在HAVING子句中没有使用cid字段。
B选项使用了MySQL中的子查询语法。首先使用EXISTS关键字来判断是否存在班级均分大于等于80分的班级,在子查询中先对evaluate表进行分组,按照cid字段分组,然后使用AVG函数计算每个班级的平均分。在HAVING子句中对平均分进行过滤,只选择平均分大于等于80分的班级。
在父查询中,查询grade表中所有记录。在WHERE子句中使用EXISTS子查询,只有在子查询中能找到符合条件的记录时,父查询才会返回对应的grade表记录。
最后使用ORDER BY子句对结果进行排序,按照cid字段降序排列,最后使用LIMIT 5 限制结果集只包含前5行。
SELECT * FROM ( SELECT * FROM grade t1 WHERE EXISTS ( SELECT t2.cid,AVG(t2.point) AS avg -- ORACLE中这样重命名是不允许用的 FROM evaluate WHERE t1.cid = t2.cid GROUP BY cid HAVING AVG(t2.point)>=80) ORDER BY t1.cid DESC ) t3 WHERE ROWNUM <= 5;我觉得oracle的正确写法是酱紫,答案中的4个选项在oracle中没有正确的。