50個查詢系列-第五個查詢:查詢沒學過“葉平”老師課的同學的學號、姓名;


查詢沒學過“葉平”老師課的同學的學號、姓名:

我們反着來 !不是要查沒上過課的同學的名字嗎。我們先查上葉平的課的學生。

思路:

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了。沒有重復記錄了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM