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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的课程。

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




 











以上是关于50个查询系列-第六个查询:查询学过“001”并且也学过编号“002”课程的同学的学号姓名的主要内容,如果未能解决你的问题,请参考以下文章

50个查询系列-第五个查询:查询没学过“叶平”老师课的同学的学号姓名;

50个查询系列-第七个查询:查询学过“叶平”老师所教的所有课的同学的学号姓名

50个查询系列-第12个查询:查询至少学过学号为“1001”同学所有课程的其他同学学号和姓名

50个查询系列-第8个查询:查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号姓名;

50道SQL练习题(刷完直接进大厂)

50个查询系列-第一个查询