每天会在网上找两三道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是唯一的呀。
标签:--,sid,查询,002,001,sql,第四天,table,select From: https://www.cnblogs.com/ccnn9/p/17411551.html