查詢學過“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的課程。
同時滿足這兩個條件的學生就是同時上過兩門課的學生。