詳細版本見個人博客:MySQL嵌套子查詢和相關子查詢執行過程的區別
子查詢可以分爲 相關子查詢 和 嵌套子查詢 兩類。
一、本文用到的測試數據
假設Books表如下:
類編號 | 圖書名 | 出版社 | 價格 |
---|---|---|---|
2 | c#高級應用 | 聖通出版 | 23.00 |
2 | Jsp開發應用 | 機械出版社 | 45.00 |
3 | 高等數學 | 濟南出版社 | 25.00 |
3 | 瘋狂英語 | 清華大學出版社 | 32.00 |
二、嵌套子查詢
嵌套子查詢的執行不依賴於外部的查詢。
執行過程:
- (1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作爲外部查詢的條件使用。
- (2)執行外部查詢,並顯示整個結果。
嵌套子查詢一般可以分爲:返回單值的子查詢 和 返回一個列表的子查詢。
1、返回單值
查詢所有價格高於平均價格的圖書名,作者,出版社和價格。
SELECT 圖書名,作者,出版社,價格
FROM Books
WHERE 價格 >
(
SELECT AVG(價格)
FROM Books
);
2、返回值列表
查詢所有借閱圖書的讀者信息
SELECT *
FROM Readers
WHERE 讀者編號 IN
(
SELECT 讀者編號
FROM [Borrow History]
)
三、相關子查詢
相關子查詢的執行依賴於外部查詢。多數情況下是子查詢的WHERE子句中引用了外部查詢的表。
執行過程:
- (1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。
- (2)執行內層查詢,得到子查詢操作的值。
- (3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。
- (4)然後外層查詢取出下一個元組重複做步驟1-3,直到外層的元組全部處理完畢。
1、相關子查詢的例子
查詢Books表中大於該類圖書價格平均值的圖書信息
SELECT 圖書名,出版社,類編號,價格
FROM Books As a
WHERE 價格 >
(
SELECT AVG(價格)
FROM Books AS b
WHERE a.類編號=b.類編號
)
與前面介紹過的子查詢不同,相關子查詢無法獨立於外部查詢而得到解決。該子查詢需要一個“類編號”的值。而這個值是個變量,隨MySQL檢索Books表中的不同行而改變。下面詳細說明該查詢執行過程:
先將Books表中的第一條記錄的“類編號”的值“2”代入子查詢中,子查詢變爲:
SELECT AVG(價格)
FROM Books AS b
WHERE b.類編號=2
子查詢的結果爲該類圖書的平均價格,所以外部查詢變爲:
SELECT 圖書名,出版社,類編號,價格
FROM Books As a
WHERE 價格 > 34
如果WHERE條件爲True,則第一條結果包括在結果集中,否則不包括。對Books表中的所有行運行相同的過程,最後返回形成的結果集。
詳細版本見個人博客:MySQL嵌套子查詢和相關子查詢執行過程的區別