子查詢有兩種類型,一種是只返回一個單值的子查詢,這時它可以用在一個單值可以使用的地方,這時子查詢可以看作是一個擁有返回值的函數;另外一種是返回一列值的子查詢,這時子查詢可以看作是一個在內存中臨時存在的數據表。
1.嵌套子查詢
嵌套子查詢的執行不依賴于外部的查詢。執行過程:
(1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作為外部查詢的條件使用。
(2)執行外部查詢,并顯示整個結果。
嵌套子查詢一般可以分為:返回單值的子查詢?和?返回一個列表的子查詢。
--返回單值的子查詢
SElECT 圖書名,作者,出版社,價格 FROM Books
WHERE 價格 >
(
SELECT AVG(價格)? FROM Books
)
--返回列表的子查詢
SElECT * FROM Readers
WHERE 讀者編號 IN
( SELECT 讀者編號 FROM [Borrow History] )
2.相關子查詢
相關子查詢的執行依賴于外部查詢。多數情況下是子查詢的WHERE子句中引用了外部查詢的表。執行過程:
(1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。
(2)執行內層查詢,得到子查詢操作的值。
(3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。
(4)然后外層查詢取出下一個元組重復做步驟1-3,直到外層的元組全部處理完畢。
--查詢Books表中大于該類圖書價格平均值的圖書信息
SElECT圖書名,出版社,類編號,價格FROM?Books?As?aWHERE價格>(SELECT?AVG(價格)FROM?Books?AS?bWHERE?a.類編號=b.類編號)
使用SQL跨表批量導入數據時實用的例子
利用相關子查詢只插入test2中不存在的記錄,避免因插入重復記錄而失敗
insert into test2(userid, username)
select userid, username from test1
where not exists(
select userid from test2 where
test2.userid = test1.userid
)
EXISTS就是用來測試子查詢的結果是否為空,如果結果集為空則匹配結果為false,否則匹配結果為true。
--如果存在山東省的讀者,將T_Book表中所有記錄查詢出來;否則,查詢結果為空
SELECT?*?FROM?T_Book?WHERE?EXISTS?(SELECT?*?FROM?T_Reader?WHERE?FProvince='ShanDong'?)
--查詢某一類圖書的分類id,最小最大出版年份,數量
select C.FId,
MIN(B.FYearPublished) as minpublished,
MAX(B.FYearPublished) as maxpublished,
COUNT(0) as Number
from T_Category C inner join T_Book B
ON C.FId = B.FCategoryId
group by C.FId
--查詢某一類圖書的分類id,圖書的名稱,最早出版年份
select T_Category.FId, T_Book.FName, T_Book.FYearPublished from
T_Category inner join T_Book
ON T_Category.FId = T_Book.FCategoryId
WHERE T_Book.FYearPublished = (
select MIN(T_Book.FYearPublished) from
T_Book WHERE T_Book.FCategoryId = T_Category.FId
)
3.WITH和子查詢
SQL提供了WITH子句用于為子查詢定義一個別名,這樣就可以通過這個別名來引用這個子查詢了,也就是實現“一次定義多次使用”。
WITH子句的格式為:WITH別名AS?(子查詢)
WITH person_tom AS (
SELECT * FROM T_Person?? WHERE FName='TOM'
)
SELECT * FROM T_Person WHERE FAge=person_tom.FAge OR FSalary=person_tom.FSalary
參考文獻:
1.程序員的sql金典
如果您有什么問題,歡迎在下面評論,我們一起討論,謝謝~
如果您覺得還不錯,不妨點下右下方的推薦,有您的鼓勵我會繼續努力的~