sql--每天两道sql题,天天健康好身体_第二天

发布时间 2023-05-16 21:43:05作者: 娜娜99

每天会在网上找两三道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  是有规则的