13.2.8.7.關聯子查詢
13.2.8.7. 關聯子查詢
相關聯的子查詢是一個包含對表的引用的子查詢。該表也顯示在外部查詢中。例如:
SELECT * FROM t1 WHERE column1 = ANY
(SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
注意,即使子查詢的FROM子句不提及表t1,該子查詢也會包含一個對t1中一列的引用。所以,MySQL看上去位于子查詢的外部,并在外部查詢中查找t1。
假設表t1包含一行,在此行中column1=5并且column2=6;同時,表t2包含一行,在此行中column1=5并且column2=7。簡單的表達式... WHERE column1 = ANY (SELECT column1 FROM t2)會為TRUE。但是在本例中,在子查詢中的WHERE子句為FALSE(因為(5,6)不等于(5,7)),所以子查詢總體上為FALSE。
范圍劃分規則:MySQL從內到外進行評估。例如:
SELECT column1 FROM t1 AS x
WHERE x.column1 = (SELECT column1 FROM t2 AS x
WHERE x.column1 = (SELECT column1 FROM t3
WHERE x.column2 = t3.column1));
在本語句中,x.column2必須是表t2中的列,因為SELECT column1 FROM t2 AS x ...對t2進行了重命名。它不是表t1中的列,因為SELECT column1 FROM t1 ...是一個更靠外的外部查詢。
對于HAVING或ORDER BY子句中的子查詢,MySQL也會在外部選擇清單中尋找列名稱。
對于特定的情況,相關聯的子查詢被優化。例如:
val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)
否則,這些子查詢效率不高,可能速度會慢。把查詢作為聯合進行改寫可能會改進效率。
相關聯的子查詢不能從外部查詢中引用總計函數的結果。