数据库嵌套查询
SQL語言允許多層嵌套查詢,即一個子查詢中還可以嵌套其他子查詢。需要特別指出的是,子查詢的 SELECT語句中不能使用 ORDER BY子句, ORDER BY子句只能對最終查詢結(jié)果排序。
?
1.帶有IN謂詞的子查詢
在嵌套查詢中,子查詢的結(jié)果往往是一個集合,所以謂詞IN是嵌套查詢中最經(jīng)常使用的謂詞
例 3.55 查詢與“劉晨”在同一個系學(xué)習(xí)的學(xué)生
(1)確定“劉晨”所在系名
SELECT Sdept FROM Student WHERE Sname='劉晨';
(2)查找所有在CS系學(xué)習(xí)的學(xué)生
將上面的兩步構(gòu)造嵌套查詢得:
查詢結(jié)果和圖二相同
?
自身連接查詢解法
本例中子查詢的查詢條件不依賴于父查詢,稱為不相關(guān)子查詢。一種求解方法是由內(nèi)向外處理,既先執(zhí)行子查詢子查詢的結(jié)果,用于建立其父查詢的查找條件。
?
2.帶有比較運算符的子查詢
例 3.57 找出每個學(xué)生超過他自己選修課程平均成績的課程號
SELECT Sno,Cno FROM SC x WHERE Grade>=(SELECT AVG(Grade) /*某學(xué)生的平均成績*/FROM SC yWHERE y.Sno=x.Sno);
x是表SC的別名,又稱為元組變量,可以用來表示SC的一個元組。內(nèi)層查詢是求個學(xué)生所有選修課程平均成績的,至于是哪個學(xué)生的平均成績要看參數(shù)x.Sno的值,而該值是與父查詢相關(guān)的,因此這類查詢稱為相關(guān)子查詢
理解:
(1) 從外層查詢中取出SC的一個元組x,將元組x的Sno值 (201215121)傳送給內(nèi)層查詢
SELECT AVG(Grade) FROM SC y WHERE y.Sno='201215121';(2) 執(zhí)行內(nèi)層查詢,得到值88(近似值,用該值代替內(nèi)層查詢,得到外層查詢
SELECT Sno,Cno FROM SC x WHERE Grade>=88;(3) 執(zhí)行這個查詢,得到
(201215121,1)
(201215121,3)
然后外層查詢?nèi)〕鱿乱粋€元組重復(fù)做上述①至步驟的處理,直到外層的SC元組全部處理完畢。結(jié)果為
3.帶有ANY(SOME)或ALL謂詞的子查詢
| ANY | IN | - - | <MAX | <=MAX | >MIN | >=MIN |
| ALL | - - | NOT IN | <MIN | <=MIN | >MAX | >=MAX |
例 3.59 查詢非機算機科學(xué)系比計算機科學(xué)系所有學(xué)生年齡都小的學(xué)生姓名及年齡
SELECT Sname,Sage FROM Student WHERE Sage<ALL(SELECT SageFROM StudentWHERE Sdept='CS')AND Sdept<>'CS';關(guān)系數(shù)據(jù)庫管理系統(tǒng)執(zhí)行此查詢時,首先處理子?xùn)嗽?#xff0c;找出CS系中所有學(xué)生的年齡構(gòu)成一個集合(20,19)。然后處理父查詢,找所有不是CS系且年齡既小于20,也小于19的學(xué)生。查詢結(jié)果為
用聚集函數(shù)的方法:
?
4.帶有EXISTS謂詞的子查詢
帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”
例 3.62 查詢選修了全部課程的學(xué)生姓名
//即沒有一門課程是他不選的 SELECT Sname FROM Student WHERE NOT EXISTS(SELECT*FROM CourseWHERE NOT EXISTS(SELECT*FROM SCWHERE Sno=Student.Sno AND Cno=Course.Cno));還沒弄懂,弄懂再補
例 3.63 查詢至少選修的學(xué)生201215122選修的全部課程的學(xué)生號碼
//不存在這樣的課程y,學(xué)生201215122選修的y,而學(xué)生x沒有選 SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS(SELECT*FROM SC SCYWHERE SCY.Sno='201215122' ANDNOT EXISTS(SELECT*FROM SC SCZWHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));同上
總結(jié)
- 上一篇: 半导体界仙童“八叛逆”又一人去世,仅存一
- 下一篇: c语言双人贪吃蛇小游戏代码,关于C 双人