學生選課信息共三個表:
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的學生未選修的課程是否爲空,爲空的的話保留。
........
遍歷完學生信息表中的元組以後,也就把全部符合條件的元組選出來了。