50个查询系列-第六个查询:查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

查询学过“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的课程。

同时满足这两个条件的学生就是同时上过两门课的学生。




原文地址:https://www.cnblogs.com/shenxiaoquan/p/6115563.html