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