首页 > 代码库 > 50个查询系列-第五个查询:查询没学过“叶平”老师课的同学的学号、姓名;
50个查询系列-第五个查询:查询没学过“叶平”老师课的同学的学号、姓名;
查询没学过“叶平”老师课的同学的学号、姓名:
我们反着来 !不是要查没上过课的同学的名字吗。我们先查上叶平的课的学生。
思路:
1.先去查叶平上的课的课程id:
SELECT t1.courseid kid FROM tblcourse t1, (SELECT tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName=‘叶平‘) t2 WHERE t1.teaid=t2.tid -- 查出来叶平老师上的课的课程id
结果是:
2;去成绩表中(tblscore)查有这个课程id的学生。
SELECT tblscore.StuId FROM tblscore, ( SELECT t1.courseid kid FROM tblcourse t1, (SELECT tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName=‘叶平‘) t2 WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id WHERE tblscore.CourseId=ykid.kid
结果如下:
我们可以看到上面的结果中有两个1013,这是因为这个学生有两门课都是叶平的课在查询时就查出来了。
我当时就很纠结,怎么才能把重复结果去掉呢。就一个1013好了。
后来我看了答案。答案也是这样的,两个1013
后来我对啊。我们最后查出来要的是不在这个列表里面的学生的id啊,那么这个列表里有几个重复的学生其实是没有关系的。
所以最后的写法就是:
SELECT * FROM tblstudent WHERE tblstudent.StuId NOT IN ( SELECT tblscore.StuId FROM tblscore, ( SELECT t1.courseid kid FROM tblcourse t1, (SELECT tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName=‘叶平‘) t2 WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id WHERE tblscore.CourseId=ykid.kid )
查询结果:
答案的写法是:
SELECT StuId,StuName FROM tblStudent WHERE StuId NOT IN ( SELECT StuID FROM tblScore sc INNER JOIN tblCourse cu ON sc.CourseId=cu.CourseId INNER JOIN tblTeacher tc ON cu.TeaId=tc.TeaId WHERE tc.TeaName=‘叶平‘ )
扩展:
上面说到了重复记录怎么去除呢:用函数distinct
SELECT DISTINCT(t11.idd) FROM (SELECT tblscore.StuId idd FROM tblscore, ( SELECT t1.courseid kid FROM tblcourse t1, (SELECT tblteacher.TeaId tid FROM tblteacher WHERE tblteacher.TeaName=‘叶平‘) t2 WHERE t1.teaid=t2.tid) ykid-- 查出来叶平老师上的课的课程id WHERE tblscore.CourseId=ykid.kid )t11
结果:
就一个1013了。没有重复记录了。
50个查询系列-第五个查询:查询没学过“叶平”老师课的同学的学号、姓名;
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。