前言
今天上午起來復習了老師上課講的選課問題。我總結了三個解法以及一點注意事項。
選課問題介紹
簡單來說就是查詢某某同學沒有選或者選了什么課。然后查詢出該同學的姓名,學號,課程號,課程名之類的。
sql文件我上傳了。大家可以嘗試練一練。
解題代碼如下(含思路)
以"查詢19105號學生漏選了哪些課程"為例子.
-- 數據庫查詢的練習
-- 查詢19105號學生漏選了哪些課程
-- 法一 使用左外連接+笛卡爾積的方式
-- 1.列出19105號學生應選出的課 笛卡爾積
select Sno,Sname,Cno,Cname from student,course where Sno='19105';
-- 2.進行左外連接 選課的正確邏輯是學號相同且課程號也相同
SELECT * from (select Sno,Sname,Cno,Cname from student,course where Sno='19105') scall left OUTER JOIN
sc ON sc.sno=scall.Sno AND sc.Cno=scall.Cno;
-- 3.篩選出漏選的課,則成績為null的
-- 錯誤寫法SELECT * from (select Sno,Sname,Cno,Cname from student,course where Sno='19105') scall left OUTER JOIN sc ON sc.sno=scall.Sno AND sc.Cno=scall.Cno AND sc.Grade IS null;
-- 正確寫法SELECT * from (select Sno,Sname,Cno,Cname from student,course where Sno='19105') scall left OUTER JOIN sc ON sc.sno=scall.Sno AND sc.Cno=scall.Cno where sc.Grade is NULL;-- 法二
-- 子查詢+IN集合
-- 1.在sc表中找到19105已經選課的課程編號
SELECT Cno FROM sc where sc.Sno='19105';
-- 2.使用not in+子查詢方式
SELECT Sno,sname,cno,Cname FROM student,course where Cno not in (SELECT Cno FROM sc where sc.Sno='19105');
-- 3.限定為19105
SELECT Sno,sname,cno,Cname FROM student,course where sno='19105' AND Cno not in (SELECT Cno FROM sc where sc.Sno='19105');-- 法三
-- 子查詢加exists解決
SELECT Sno, sname, Cno, cname
FROM student, course
WHERE student.sno = '19105' -- 明確指定表別名AND NOT EXISTS (SELECT 1 FROM sc WHERE sc.Sno = student.Sno -- 關聯當前學生AND sc.Cno = course.Cno -- 關聯當前課程);-- 錯誤寫法 注意與正確寫法做區分
SELECT Sno, sname, Cno, cname
FROM student, course
WHERE student.sno = '19105' -- 明確指定表別名AND NOT EXISTS (SELECT 1 FROM sc,student,course WHERE sc.Sno = student.Sno -- 關聯當前學生AND sc.Cno = course.2Cno -- 關聯當前課程);
注意事項?
結語?
byebye~
?
?