查詢選修了全部課程的學生姓名:
第一種:
理解為:查詢一個人的姓名,這個人不存在課程沒選擇。
思路:
1.拿出Student表的第一行數據
2.拿出Course表的第一行數據
3.拿出SC表的第一行數據 (其實這個表就是用來與前兩個表進行對比判斷的)
for(循環從Student表拿一行學生數據){
for(循環從Course表拿一行課程信息){
for(循環在SC表拿一行進行比對){
SC表中的這條數據判斷:
SC.Sno == Student.Sno , SC.Cno == Course.Cno;
/*是否SC表中的學號 = Student表中的學號 且
SC表中的Cno = Course表中的Cno*/
}
}
}
sql語句:
SELECT Sname /*查詢一個學生的學號 (在Student表中循環取學生信息)*/
FROM Student
WHERE NOT EXISTS( /*不存在課程 (在Course中循環取所有課程信息)*/
SELECT *
FROM Course
WHERE NOT EXISTS( /*沒選修 (在SC表中循環比對) */
SELECT *
FROM SC
WHERE SC.Sno = Student.Sno AND SC.Cno = Course.Cno
)
);
結果:選擇出學生的姓名,這個學生所有課程都選修了
第二種:
思路:
查詢一個學生的姓名,該學生選修課的門數等於所有課程的門數
逆推:查詢一個學生的姓名,姓名怎么來?
通過Student的學號得到,學號怎么得到?
通過在SC表中Sno分組判斷該學生的選修的課程門數是否等於所有課程的門數得到,所有課程門數如何得到?
通過在Course表中COUNT(*)得到
SQL語句:
SELECT Sname
FROM Student
WHERE Sno in (
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) = ( /*該學生的選修的課程門數 = 所有課程的門數*/
SELECT COUNT(*) /*所有課程的門數*/
FROM Course
)
);