(不)相關查詢在嵌套查詢中應用,嵌套查詢最能體現SQL結構化查詢的特點
本篇內容,先看示例,食用更佳
1. 不相關子查詢
特點
由子向父執行(子 -> 父),且父查詢和子查詢可以輕鬆分開單獨處理
示例
題目
查詢與’韓梅梅’同專業的學生信息
分析
子查詢:得到’韓梅梅’的專業名
父查詢:利用子查詢的結果,查詢同專業的學生信息
/* 該表結構爲:
* 學生信息表(學號,姓名,專業名)
*/
SELECT 學號, 姓名, 專業名
FROM 學生信息表
WHERE 專業 IN
(SELECT 專業名
FROM 學生信息表
WHERE 姓名='韓梅梅');
分步第一步:可以輕鬆手動分開查詢,先進行子查詢
/*
* 第一步,查詢'韓梅梅'的專業名
*/
SELECT 專業名
FROM 學生信息表
WHERE 姓名='韓梅梅'
/*
結果示例:得到一個集合N,裏面只有一個元素'計科'
|專業名|
+-----+
| 計科 |
*/
分步第二步:再利用第一步結果集合N,執行父查詢的操作
/*
* 第二步,查詢'計科'專業的學生信息
*/
SELECT 學號, 姓名, 專業名
FROM 學生信息表
WHERE 專業 IN N -- N 爲第一步結果
類似的,父子查詢僅有查詢結果直接的關係(父用子的結果),而查詢條件之間無依賴,則爲不相關子查詢
2. 相關子查詢
特點
- 父查詢和子查詢使用一些相同的查詢條件,所以不易分開處理
- 相關子查詢不能一次就求解出子查詢的結果,必須反覆求值
- 相關子查詢事先規定了執行規則,有固定處理順序
執行規則
(父 -> 子 -> 父)
- 外層查詢條件的表中取出一個元組,傳送給內層
- 執行內層查詢,得到一個結果,返送給外層
- 執行外層查詢,得到一個結果,作爲這一次查詢結果
- 執行步驟1,直到外層查詢條件的表的元組全部取完
執行規則的第一步,天坑!每次查詢時只取一行,隨即馬上傳送給內層來執行!!!
外層不是一次性傳整張表,否則內層條件與外層條件同爲一張表,就無意義,一定體現差異!!!
不是從內層開始執行,不同於不相關子查詢,第一步在外層取元組!!!
不是一次就求出結果,是反覆查詢,自帶了循環!!!
示例
題目:查詢每個學生超過他自己選修課程平均成績的課程名
/* 該表結構爲:
* 課程成績表(學號,課程名,成績)
*/
SELECT 學號, 課程名
FROM 課程成績表 x
WHERE 成績>=(SELECT AVG(成績)
FROM 課程成績表 y
WHERE y.學號=x.學號);
最後一行需要別名的原因
外層:課程成績表在循環時是一行一行的取值;
內層:需要整張表y由某一行x(x在內層查詢中由相關子查詢的規定已經成一個元組,而非整張表)限定,所以需要起別名區分
(表面x,y同爲一張表,私底下x已變身爲一行元組)
步驟
- 從
課程成績表
中取一行(x在此處含義爲元組),傳送給子查詢 - 子查詢通過
WHERE
限定,得到僅含x元組對應學號的所有課程成績信息的表☆ - 從☆表中,求得成績的平均值,即爲x元組對應學號的所有課程平均成績O
- 將O帶到外層查詢(此處外層x的含義又變成整張表),得本次循環的查詢結果
- 循環執行步驟1,直到課程成績表的所有元組處理完,得到最終值