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

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

以下是四个表信息:

 

问题1:查询同时选修了001和002课程的同学的学号

答案1:select sid from grade_table where cid=002 and sid in (select sid from grade_table where cid=001)

思考:先通过子查询从成绩表中筛选出 选修了001 课程的学生(子查询出来的学生,要么是选了001也选了002 ,要么是选了001但没有选002), 然后外面再做一层查询,查询成绩表中既选修了002课程,又sid 是包含在 第一个子查询的结果中的。这样查出来的就是既选了001又选了002的学生。

 

问题2:查询没有学全所有课程的学生的学号和姓名

答案2: select s.sid s.sname from student_info_table  s  where s.sid in (select g.sid from grade_table  g  group by g.sid  having  count(g.cid) < (select count(cid)  from class_info_table )  )

思考:别人的答案,select s.sid, s.name from student_info_table  s, grade_table g  where s.sid=g.sid  group by  s.sid, s.name  having  count(g.cid) < (select count(cid)  from class_info_table)    此答案用例一个连表查询和一个子查询。 而我的答案是用了两个子查询。可以想想哪个更好呢?

还有,这个答案为什么group by 的时候要 s.sid 和s.name, 感觉只group by  s.sid 就可以了呀。因为sid是唯一的呀。

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