查詢沒學過“葉平”老師課的同學的學號、姓名:
我們反着來 !不是要查沒上過課的同學的名字嗎。我們先查上葉平的課的學生。
思路:
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了。沒有重復記錄了。
