【SQL】(不)相關子查詢

(不)相關查詢在嵌套查詢中應用,嵌套查詢最能體現SQL結構化查詢的特點

本篇內容,先看示例,食用更佳

1. 不相關子查詢

特點

由子向父執行(子 -> 父),且父查詢和子查詢可以輕鬆分開單獨處理

示例

題目

查詢與’韓梅梅’同專業的學生信息

分析

子查詢:得到’韓梅梅’的專業名

父查詢:利用子查詢的結果,查詢同專業的學生信息

/* 該表結構爲:
 * 學生信息表(學號,姓名,專業名)
 */
SELECT 學號, 姓名, 專業名
FROM 學生信息表
WHERE 專業 IN
	(SELECT 專業名
     FROM 學生信息表
     WHERE 姓名='韓梅梅');

分步第一步:可以輕鬆手動分開查詢,先進行子查詢

/*
 * 第一步,查詢'韓梅梅'的專業名
 */
SELECT 專業名
FROM 學生信息表
WHERE 姓名='韓梅梅'

/*
結果示例:得到一個集合N,裏面只有一個元素'計科'
|專業名|
+-----+
| 計科 |
*/

分步第二步:再利用第一步結果集合N,執行父查詢的操作

/*
 * 第二步,查詢'計科'專業的學生信息
 */
SELECT 學號, 姓名, 專業名
FROM 學生信息表
WHERE 專業 IN N -- N 爲第一步結果

類似的,父子查詢僅有查詢結果直接的關係(父用子的結果),而查詢條件之間無依賴,則爲不相關子查詢

2. 相關子查詢

特點

  1. 父查詢和子查詢使用一些相同的查詢條件,所以不易分開處理
  2. 相關子查詢不能一次就求解出子查詢的結果,必須反覆求值
  3. 相關子查詢事先規定了執行規則,有固定處理順序

執行規則

(父 -> 子 -> 父)

  1. 外層查詢條件的表中取出一個元組傳送給內層
  2. 執行內層查詢,得到一個結果,返送給外層
  3. 執行外層查詢,得到一個結果,作爲這一次查詢結果
  4. 執行步驟1,直到外層查詢條件的表的元組全部取完

執行規則的第一步,天坑!每次查詢時只取一行,隨即馬上傳送給內層來執行!!!

外層不是一次性傳整張表,否則內層條件與外層條件同爲一張表,就無意義,一定體現差異!!!

不是從內層開始執行,不同於不相關子查詢,第一步在外層取元組!!!

不是一次就求出結果,是反覆查詢,自帶了循環!!!

示例

題目:查詢每個學生超過他自己選修課程平均成績的課程名

/* 該表結構爲:
 * 課程成績表(學號,課程名,成績)
 */
SELECT 學號, 課程名
FROM 課程成績表 x
WHERE 成績>=(SELECT AVG(成績)
              FROM 課程成績表 y
			  WHERE y.學號=x.學號);

最後一行需要別名的原因

外層:課程成績表在循環時是一行一行的取值;

內層:需要整張表y由某一行x(x在內層查詢中由相關子查詢的規定已經成一個元組,而非整張表)限定,所以需要起別名區分

(表面x,y同爲一張表,私底下x已變身爲一行元組)

步驟

  1. 課程成績表中取一行(x在此處含義爲元組),傳送給子查詢
  2. 子查詢通過WHERE限定,得到僅含x元組對應學號的所有課程成績信息的表☆
  3. 從☆表中,求得成績的平均值,即爲x元組對應學號的所有課程平均成績O
  4. 將O帶到外層查詢(此處外層x的含義又變成整張表),得本次循環的查詢結果
  5. 循環執行步驟1,直到課程成績表的所有元組處理完,得到最終值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章