其实我想大家也都已经注意到了,最后一题的问题和第一题有点相似:
第一题:select * from 购物信息 where 购物人 in (select 购物人 from 购物信息 group by 购物人 having count(*) >= 2);
最后一题:select * from student where name in (select name from studentwhere name like '张%' group by name having avg(score) > 75)
刚开始我也认为是应该这样:
第一题:select * from 购物信息 group by 购物人 having count(*) >= 2
最后一题:select * from studentwhere name like '张%' group by name having avg(score) > 75
之后看了看答案和恢复,又比较了两题得相似性,我自己认为就像楼上的仁兄说的“GROUP BY 表示分组,但是不是随便哪些字段分组都可以,SELECT后面的所有字段,除了SUM、COUNT、AVG等汇总统计字段之外,其它的都必须放在GROUP BY里面进行分组”。拿最后一题来说,GROUP BY后面是NAME字段,而如果结果是:
select * from studentwhere name like '张%' group by name having avg(score) > 75,那么就与仁兄所说的话违背了:*代表了符合要求的所有记录,里面的字段除了有NAME外,还有COURSE和SCORE,但是COURSE不是GROUP BY的,换句话说他与分组时无关的,我自己想应该是如果有分组条件存在在SQL语句中,那么SQL后面不能跟其他的和分组无关的字段。
所以像第一题和最后一题,如果只是需要“购物人”和“NAME"这俩个字段的信息,答案可以是:
第一题:select * from 购物信息 group by 购物人 having count(*) >= 2
最后一题:select * from studentwhere name like '张%' group by name having avg(score) > 75
如果需要的是*,是所有字段的信息,那么我就要“多此一举”的加子查询,借用“IN"来输出我们想要的所有字段的信息。