關於數據庫」 查詢選修全部課的學生信息「 exists解法的理解

學生選課信息共三個表:
spa

S:學生基本信息table

  sno   sname
select

95001 李二
95002 王三
95003 趙四
95004 孫小毛
95005 王大侃

C:課程基本信息循環

 cno   cname
遍歷

1 邏輯與幽默
2 電影藝術欣賞
3 大學生文化之道
4 領導魅力論

SC:選課信息查詢

sno    cno
word

95001 1
95002 3
95004 4
95005 2
95001 3
95001 2
95001 4

首先得搞懂嵌套查詢中相關子查詢的執行過程:tab

 首先選取父查詢表中的一個元組,內部的子查詢利用此元組中的相關屬性值進行查詢ab

而後父查詢根據子查詢返回的結果判斷此行是否知足查詢條件,若知足,則把該行放入父查詢的查詢結果中。文章

至關於一個循環,逐個的實驗。

咱們先來看看這個問題

問題1、

查詢學號爲‘95002’的學生選修的課程信息

select * from C  where exists (select * from SC where SC.cno = C.cno and SC.sno = '95002' );

按照上述的相關子查詢的執行過程:

C表中共有課程號爲1,2,3,4的四門課,子查詢把這四個學號對應的四個元組逐一帶入,

根據子查詢中的條件SC.cno = C.cno and SC.sno = '95002' 

當C.cno = 1, 不存在符合條件的元組,exists返回false,父查詢中不把該C.cno對應的元組放到查詢結果中

當C.cno = 2,存在符合條件的元組,exists返回true,父查詢中把該C.cno對應的元組放到查詢結果中

當C.cno = 3 .......

當C.cno = 4 .........

逐一查詢以後,就把C.cno =2 對應的元組選出來了

同理問題2、

查詢學號爲‘95002’未選修的課程就是

select * from C where not exists (select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno);


好了,接下來咱們分析文章開始提出的問題:

select * from S where not exists

                                  (select * from C where not exists  

                                                                (select * from SC where SC.sno = ‘95002’ and SC.cno = C.cno));

還記得咱們學過的

            for(i= 0 ;i < 5;i++)

                    for(j = 0; j < 4;j++)

                         某語句;

仿照上述的分析過程S表中學號分別爲95001,.....,95005對應的五個元組

 當Sno =95001時,這個問題就又轉化爲問題二了。學號爲95001的學生未選修的課程是否爲空,爲空的的話保留。

........

遍歷完學生信息表中的元組以後,也就把全部符合條件的元組選出來了。

相關文章
相關標籤/搜索