首页 > 试题广场 >

现有评分表evaluate(包含班级编号cid和分数poin

[单选题]

在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 ;

无关子查询,四个选项都不能满足题意
发表于 2022-01-25 22:59:10 回复(0)
执行顺序:from--where--group by--having--select--order by--limit;
C选项中没有select cid,但后面又order by cid,矛盾了
应该选B选项,select cid,AVG(point) AS avg FROM evaluate GROUP BY cid
发表于 2022-02-19 12:28:47 回复(4)
我只能说我看着B和C都是对的,至于楼上说的order by的grade.cid,那是班级表的cid,和内表有没有select id有什么关系呢。
顺便)我也觉得having不能用别名,select 在 having 后面,having的时候别名还没给呢。

至于说无关的,我第一反应也是无关,因为我以为是展示该班级的记录,后面发现是只要有班级满足条件就要的是前五个班级,那就不需要内外表做连接。
发表于 2022-03-11 00:24:18 回复(11)
B选项也不对,子查询里缺少一句cid关联,正确如下:
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;



编辑于 2023-12-22 11:43:27 回复(0)
exsit内外无关联,这题应该是错的吧。。看了好久都没看懂
发表于 2023-10-09 21:52:16 回复(0)
having没错么?可以直接用重命名了?
发表于 2022-01-08 12:44:06 回复(4)
这题有问题吧,我bc都测试了结果都不符合题意而且bc都执行出相同的结果,要说语义上讲都没差
发表于 2022-11-16 19:58:42 回复(0)
执行顺序
from where group by having select order by limit
编辑于 2024-02-28 22:52:46 回复(0)

A语句不正确,因为它没有限制结果只输出前五条记录。

B语句正确,它使用了EXISTS关键字来判断是否有班级均分大于等于80分,如果存在则显示grade表中cid由大到小排名的前五行记录。

C语句不正确,因为它在HAVING子句中没有使用cid字段。

D语句不正确,因为它在WHERE子句中没有使用GROUP BY 子句和AVG()函数。

B选项使用了MySQL中的子查询语法。首先使用EXISTS关键字来判断是否存在班级均分大于等于80分的班级,在子查询中先对evaluate表进行分组,按照cid字段分组,然后使用AVG函数计算每个班级的平均分。在HAVING子句中对平均分进行过滤,只选择平均分大于等于80分的班级。

在父查询中,查询grade表中所有记录。在WHERE子句中使用EXISTS子查询,只有在子查询中能找到符合条件的记录时,父查询才会返回对应的grade表记录。

最后使用ORDER BY子句对结果进行排序,按照cid字段降序排列,最后使用LIMIT 5 限制结果集只包含前5行。


发表于 2023-01-27 13:22:10 回复(1)
select 中的字段必须出现在 group by 中(聚合函数除外),但是 group by 后的字段可以不出现在 select 中,抛开 having 使用别名的问题不谈,B 和 C 都没毛病
发表于 2022-10-28 22:35:05 回复(0)
having的作用:过滤掉某分组
发表于 2022-08-12 10:36:24 回复(0)
对于mysql,c答案是对的
发表于 2022-07-14 20:47:01 回复(0)
having 后面接的条件必须是前面select (二个以上)中的一个
发表于 2022-03-21 11:14:20 回复(0)
b选项的having改成where可以嘛

发表于 2022-03-17 17:28:18 回复(1)
HAVING后面可以用SELECT中定义的新名字,但是不能对没有SELECT出的列进行筛选
发表于 2022-03-12 15:29:41 回复(0)
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中没有正确的。

发表于 2022-03-08 20:15:13 回复(0)