每天会在网上找两三道sql题练习练习,提高自己的sql语句的使用能力(先自己思考出答案,再和别人的答案做一下对比,然后深入思考一下)
以下是四个表信息:
问题1:查询所有课程都小于60分的学生的学号和姓名
答案1: select sid, count(cid) as num, sum(score) as zongchengji from grade_table group by sid hiving num*zongchengji < num*60;
思考:因为要查的是,所有课程都小于60分的学生,假如这个学生选了N门可,每门可都小于60分,则总分数肯定要小于60*N, 所有查询思路是对学生进行分组,分组后计算每个学生的选课数、总成绩,用总成绩和 选课数*60 进行比较。
别人的答案:select sid ,sname from student_ifo_table where sid not in (select s.sid from student_info_table s, grade_table g where s.sid=g.sid and g.score>60) , 一开始没明白这个答案的意思,现在明白了,先子查询是查询出来成绩大于60分的学生的id(如果A学生的英语是小于60分,数学大于60分,那也会查出来此学生的学号),不过这个子查询的结果中肯定sid是有重复值的。 然后外层的查询是 查询学生id not in 子查询的结果。即如果B同学的所有成绩都小于60的话,那子查询的结果中肯定是没有B这个同学的。这也就是为什么用的是not in + 大于60分的条件判断, 而不是 in + 小于60分的条件判断。
问题2:查询平均成绩大于60分的同学的学号和平均成绩
答案2:select sid, avg(score) as pingjun from grade_table group by sid hiving pingjun > 60;
思考:对学生进行分组,分组的学生求成绩的平均值,然后对平均值大于60的进行过滤。 这里用到分组group by、过滤hiving、平均值函数avg()
group by 介绍:
使用group by 分组查询时,select 子句中的列名必须是“分组列” 或“列函数
其次,group by 可以 和 where 、 hiving 结合进行过滤查询, 但使用where 还是 hiving 是有规则的
标签:group,--,sql,查询,60,分组,sid,两道 From: https://www.cnblogs.com/ccnn9/p/17404566.html