关于一道 SQL题目

来源:百度知道 编辑:UC知道 时间:2024/09/28 08:46:09
表名:student

name course score
张青 语文 72
王华 数学 72
张华 英语 81
张青 物理 67
李立 化学 98
张燕 物理 70
张青 化学 76
查询出“张”姓学生中平均成绩大于75分的学生信息

标准答案是
select * from student where name in (select name from student
where name like '张%' group by name having avg(score) > 75)

问题1:我也很疑惑为什么要用在用in 做嵌套?这样很效率影响查询效率,而且还麻烦.

我第一次的答案是
select * from student
group by name having avg(score) > 75
where name like '张%'
问题2:想问下GROUP BY 关键字一定要放到 WHERE 的后面吗?
select * from student
where name like '张%'
group by name having avg(score) > 75)
问题3:这个两个语句有无分别?

另外一个人的答案是
select * from (select name, course, score from student group by name having sum(score) >75) where name like'张%'
我个人认为是可以的,有没有高手说明一下啊?如果可以的话,为什么不这样写?
select * from (select * from student group by name having sum(score) >75) where name like'张

你这些问题,其实就是一个知识点,没有正确理解GROUP BY的功能

一、GROUP BY 表示分组,但是不是随便哪些字段分组都可以,SELECT后面的所有字段,除了SUM、COUNT、AVG等汇总统计字段之外,其它的都必须放在GROUP BY里面进行分组,所以,下面这样的语句是错误的:
select name, course, score from student group by name having sum(score) >75
系统会提示你course, score 两个字段都应该放在GROUP BY 后面进行分组
真正理解了GROUP BY的功能与限制之后,你上面的全部问题都会明白

二、GROUP BY应该在WHERE的后面、在ORDER BY的前面

另外,IN确实效率不好,但是格式最容易理解,所以还是会经常看见

补充:
select * from student where name like '张%' group by name having avg(score) > 75
肯定是错误的,上面说得非常清楚,你的*代表的那些所有字段,都应该出现在GROUP BY 里面

题目要求的东西确实可以用N多方法得出同样的结果
其实标准答案也是出题人的喜好,不用计较
而且这种只有几条数据的表,无论用什么影响的效率都不会太大

GROUP BY 关键字一定要放到 WHERE 的后边吗?回答:yes

你给的另一个人的答案,好像错了吧?sum(score)代表的是总分,可题目要求的是平均分吧?而且group by的用法不对,聚函数没用上,并且最后group by的东西确实少了

-----------补充的不正确----------
你前边如果select *的话,你有多少列你最后就要group by多少列