标签:png 条件 eid 姓名 tun sel stun span style
查询学过“001”并且也学过编号“002”课程的同学的学号、姓名:
我的写法:
第一步:先查出来学过“001”并且也学过编号“002”课程的同学的学号:
SELECT t11.t1sid t33id FROM (SELECT t1.StuId t1sid FROM tblscore t1 WHERE t1.CourseId=‘001‘)t11,-- 001的学生的id (SELECT t1.StuId t2sid FROM tblscore t1 WHERE t1.CourseId=‘002‘)t22-- 002的学生的id WHERE t11.t1sid=t22.t2sid
查询的结果是:
第二步:根据查出来的学生的id去查学生的姓名,学号
SELECT tblstudent.StuId,tblstudent.StuName FROM ( SELECT t11.t1sid t33id FROM (SELECT t1.StuId t1sid FROM tblscore t1 WHERE t1.CourseId=‘001‘)t11,-- 001的学生的id (SELECT t1.StuId t2sid FROM tblscore t1 WHERE t1.CourseId=‘002‘)t22-- 002的学生的id WHERE t11.t1sid=t22.t2sid )t33-- 查出来的是学过“001”并且也学过编号“002”课程的同学的学号 , tblstudent WHERE tblstudent.StuId=t33.t33id
查询结果:
答案的写法是:
SELECT StuId,StuName FROM tblStudent st WHERE (SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId=‘001‘)>0 AND (SELECT COUNT(*) FROM tblScore s2 WHERE s2.StuId=st.StuId AND s2.CourseId=‘002‘)>0
我们看一些这个写法:
他的主表是学生表(tblstudent)
SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId=‘001‘
这句话是说遍历tblstudent的每一条数据和tblscore里面的每一条数据,要求tblstudent的stuid和tblscore的数据一致:
这么一来的话候选项是:
然后
s1.CourseId=‘001‘这么一来的话:就只剩一条数据了。
如果满足
(SELECT COUNT(*) FROM tblScore s1 WHERE s1.StuId=st.StuId AND s1.CourseId=‘001‘)>0能查询出来的话就表示满足学过001的课程。
同理
(SELECT COUNT(*) FROM tblScore s2 WHERE s2.StuId=st.StuId AND s2.CourseId=‘002‘)>0能查询出来的话就表示满足学过002的课程。
同时满足这两个条件的学生就是同时上过两门课的学生。
50个查询系列-第六个查询:查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
标签:png 条件 eid 姓名 tun sel stun span style
原文地址:http://www.cnblogs.com/shenxiaoquan/p/6115563.html