嵌套查詢
- 一個SELECT-FROM-WHERE語句稱爲一個查詢塊
- 將一個查詢塊嵌套在另一個查詢塊的WHERE字句或HAVING短語的條件中的查詢叫做嵌套查詢。
- Order by不能出現在嵌套塊中。
- 上層查詢塊稱外層或父查詢,下層稱內層或子查詢。
- SQL允許多層嵌套。
按相關性(嵌套查詢的求解過程)劃分嵌套查詢:
不相關子查詢
子查詢的查詢條件不依賴於父查詢。故有裏向外逐層處理。
相關子查詢
子查詢的查詢條件依賴於父查詢。
- 取外層查詢中表的第一個元素,根據與內層查詢相關的屬性值處理內層查詢,若Where子句返回真,則此元組放入結果表中。
- 從外層表中取下一個元組,重複直至檢查完畢。
按謂詞劃分嵌套查詢:
1、帶In謂詞的子查詢
In謂詞即集合的所屬關係。
查詢與“劉晨”在同一個系學習的學生
SELECT Sno,sname,sdept
From Student
Where Sdept In
(Select Sdept
From Student
Where Student.Sname='劉晨')
//爲不相關查詢
查詢選修了課程名爲信息系統的學生學號和姓名。
兩種方法:
一、嵌套查詢
Select Sno,Sname
From Student
Where Sno in
(Select sno
From SC
Where cno In
(Select Cno
From Course
Where Cname='信息系統'))
二、連接查詢
Select Student.Sno,Sname
From Student,SC,Course
Where Student.Sno=SC.Sno AND
SC.Cno=Course.Cno And
Course.Cname='信息系統'
2、帶有比較運算符的子查詢
當確切知道內層查詢返回值爲單值時,可用比較運算符
找出每個學生超過他選修課程平均成績的課程號
Select Sno,Cno
From SC x
Where Grade>=(Select AVG(Grade)
From SC y
Where x.Sno=y.Sno)
3、帶有ANY或ALL謂詞的子查詢
ANY:查詢結果彙總任意一個值
ALL:查詢結果彙總全部值
EXIST:查詢結果是否爲空,空返回false,不空返回true。
查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生姓名和年齡。
Select Sname,sage
From Student
Where Sage<ANY(SELECT Sage
From Student
Where Sdept='CS')
AND Sdept<>'CS'
//<>爲不等於
//如查詢非計算機科學系中比計算機科學系所以一個學生年齡小的學生姓名和年齡,則將ANY改爲ALL
4、帶EXISTS謂詞的子查詢
由EXISTS引出的子查詢,目標列通常爲*,因爲其只返回真值或假值,給出列名無意義。
查詢沒有選修1號課程的學生姓名。
Select Sname
From Student
Where Not EXISTS
(SELECT *
FROM SC
WHERE SC.Sno=Student.Sno AND Cno='1')
EXISTS/NOT EXISTS可實現全程量詞(難點),例子如下:
查詢選修了所有課程的學生姓名
Select Sname
From Student
Where NOT EXISTS /位置2/
(SELECT *
FROM Course
WHERE NOT EXISTS /位置1/
(SELECT *
FROM SC
WHERE Student.Sno=SC.Sno AND
SC.Cno=Course.Cno))
理解:若一個學生選修了所有課程,則位置1始終爲false,則位置2爲true,該學生信息進入結果表
若一個學生漏選了某個課程,則位置1有一次爲true,則位置2和1之間的Select有一個值,則位置2爲false,信息不能進入結果表。
否定的否定即肯定!
EXISTS/NOT EXISTS實現邏輯蘊涵(難點)
SQL中沒有蘊含邏輯運算,已知蘊含謂詞表達式:
查詢至少選修了學生200215122選修的全部課程的學生。!!!!!!!!重要!我不會!
SELECT *
From Student S1
Where NOT EXISTS /位置2/
(SELECT *
FROM SC S2
WHERE S2.Sno='200215122' AND
NOT EXISTS /位置1/
(
SELECT *
FROM SC S3
WHERE S1.Sno=S3.Sno AND
S2.Cno=s3.Cno
))
理解同上:若一個學生選修了200215122的所有課程,則位置1始終爲false,則位置2爲true,該學生信息進入結果表
若一個學生漏選了200215122的某個課程,則位置1有一次爲true,則位置2和1之間的Select有一個值,則位置2爲false,信息不能進入結果表。