關於查找 “選修了全部課程的學生姓名”題目的理解--嘟嘟胖

首先頭腦中有三點概念:

    1 。  EXISTS 子查詢找到的提交

            NOT EXISTS 子查詢中 找不到的提交

           說明:不要去翻譯爲存在和不存在,把腦袋搞暈。

  2 。 建立程序循環的概念,這是一個動態的查詢過程。如 FOR循環 。

  3 。 Exists執行的流程Exists首先執行外層查詢,再執行內存查詢,與IN相反。 流程爲首先取出外

層中的第        一  元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢爲真,即有結果

時。返回外層表中的第一元 組,接着取出第二元組,執行相同的算法。一直到掃描完外層整表 。

         for(int i =0;  i<>EOFout;i++)

                 {

                     for (int j = 0 ; j<EOFint,j++)

                }

然後再來看一個例子: 三張表  學生表student (Sno,Sname),  課程表course (Cno,Cname) 選課表SC

(Sno,Cno)

要求查詢出 :選修了全部課程的學生姓名

我的思路:

首先學生的選課信息存在於SC表中, 要想知道某個學生是否選修了全部課程,至少我們需要知道一共有

幾門課程,這是首要的條件。其次,學生選修了與否,我們又要掃描SC全表,統計出選修了所有課程的

學生號,最後在STUDENT表中根據學生號打出姓名 。

語句如下:  (已測試)

select Sname from student             
 where Sno IN
   (select Sno from SC
      group by Sno     //根據Sno分組,統計每個學生選修了幾門課程。如果等於course的總數,就

是我們要找的Sno
     having count(*) = (select count(*) from course ))    //統計course中共有幾門課程

另一種思路:

引入:將題目換爲 查找學號爲 00003 沒有選修的科目  

        思路:我們可以將已知學號代入,把每一個科目代入(循環),這將形成1*count(*)種組合。

將這組成作爲條件,一一與SC表種進行比對,找不到匹配的我們提交 。

                 select Cname from course  where

                          not exists               //找不到的組合,提交course

                               (select * from SC where course.cno = cno and sno = '00002')

//在SC中匹配

換個題目: 查找沒有 沒有選修科目的學生姓名

         思路:學號未知 , 科目未知,說明有兩個未知變量。應該有兩個EXISTS。我們可以掃描

student 和 course

                   共有 s * c 中組合,將這些組合與SC的每一項進行匹配,注意s*c組合已經包含所

有可能。如果全部找

                   到 ,就說明已經選修了全部課程。找不到就說明有課程沒選修 。再將沒選修的的

提交給上一exists 循

                  環 。若上一

                   exists 不存在的再提交給外循環。

                        select Sname from student
                           where NOT exists        //
                              (select  * from course
                               where NOT exists      //不存在的提交給course
                                (select * from SC where
                                    Sno = student.sno  and cno = Course.Cno))   // 代入兩個未知變量

  回頭看,就是我們第一個引出的題目:

           選修了全部課程的學生姓名
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章