SQL--每日两道sql题,天天健康好身体

每天会在网上找两三道sql题练习练习,提高自己的sql语句的使用能力(先自己思考出答案,再和别人的答案做一下对比,然后深入思考一下)

以下是四个表信息:

 

问题1、查询所有同学的学号,姓名,选课数,总成绩

答案1: select sid, sname,table2.zongchengji,table2.xuankeshu from student_info_table left join (select sid, count(score) as zongchengji, count(cid) as xuankeshu from grade_table group by sid)  table2 on student_info_table.sid=table2.sid

思考:一开始想的是用inner join,  别人的答案用的是left join, 想一想感觉left join更合适,原因是grade_table中记录的都是选了课程的学生的课程考试是信息,假如aa学生一门课都没有选的话。那使用inner join 进查询出来的结果,是不会有aa 这个同学的信息

,但如果使用left join进行查询的话,查询结果中,会有aa的数据,不过,此数据中的zongchengji, xuankeshu 两个字段的值是空置。

 

问题2、查询编号100课程比101课程成绩高的所有的学生的学号

答案2:select A.sid from  ( select sid,score as 100_score from grade_table where cid=100  ) A  ,  ( select sid,score as 101_score from grade_table where cid=101 ) B  where  A.sid=B.sid and A.100_score > B.101_score

思考:这个问题主要是同一个学生下,两个不同课程的成绩的比较,而且还是,每个学生都要查出来,一开始想的是对学生进行分组,但是分组怎么搞都搞不出来结果,后来想到的思路: 每个学生的100课程的分数和和101课程分数拼成一行数据不就可以进行比较了么,即查出来所有100的课程的成绩信息作为一个表A, 查出来所有101课程的成绩信息作为表B, 然后将表A 和表B 进行表连起来进行条件筛选查询(筛选的就是A.100_score > B.101_score, 这里也不需要进行学生分组了)

其实 A B表也可以使用inner join  on  进行查询

 

问题3、查询学生信息,女生按照年龄升序排序,男生按照年龄降序排序

答案3:select * from student_info_table ordery by case when ssex="女"  then sage desc  else sage asc;

思考:这个主要是使用的 case when 方法,记住这个方法就可以,没有其他思考了

 

posted @ 2023-05-15 21:49  我是一只搬砖狗  阅读(25)  评论(0编辑  收藏  举报