每天会在网上找两三道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 方法,记住这个方法就可以,没有其他思考了
标签:join,课程,SQL,--,sid,score,sql,table,select From: https://www.cnblogs.com/ccnn9/p/17401473.html