- 13.2.8.1. 子查詢作為標量操作數
- 13.2.8.2. 使用子查詢進行比較
- 13.2.8.3. 使用ANY, IN和SOME進行子查詢
- 13.2.8.4.
使用ALL進行子查詢
- 13.2.8.5. 行子查詢
- 13.2.8.6. EXISTS和NOT EXISTS
- 13.2.8.7. 關聯子查詢
-
13.2.8.8. FROM子句中的子查詢
- 13.2.8.9. 子查詢錯誤
- 13.2.8.10. 優化子查詢
- 13.2.8.11. 把子查詢作為用于早期MySQL版本的聯合進行改寫
子查詢是另一個語句中的一個SELECT語句。
MySQL支持SQL標準要求的所有子查詢格式和操作,也支持MySQL特有的幾種特性。
以下是一個子查詢的例子:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
在本例中,SELECT * FROM t1...是外部查詢(或外部語句),(SELECT column1 FROM t2)是子查詢。我們可以說子查詢嵌套在外部查詢中。實際上,子查詢也可以嵌套在其它子查詢中,嵌套程度可以很深。子查詢必須要位于圓括號中。
子查詢的主要優勢為:
· 子查詢允許結構化的查詢,這樣就可以把一個語句的每個部分隔離開。
· 有些操作需要復雜的聯合和關聯。子查詢提供了其它的方法來執行這些操作。
· 在許多人看來,子查詢是可讀的。實際上,子查詢給予人們調用早期SQL“結構化查詢語言”的原本的想法,這是子查詢的創新。
以下是一個示例語句。該語句顯示了有關子查詢語法的要點。子查詢語法由SQL標準指定并被MySQL支持。
DELETE FROM t1
WHERE s11 > ANY
(SELECT COUNT(*) /* no hint */ FROM t2
WHERE NOT EXISTS
(SELECT * FROM t3
WHERE ROW(5*t2.s1,77)=
(SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
(SELECT * FROM t5) AS t5)));
一個子查詢會返回一個標量(單一值)、一個行、一個列或一個表(一行或多行及一列或多列)。這些子查詢被稱為標量、列、行和表子查詢。可返回一個特定種類結果的子查詢經常只被用于特定的語境中,在后面各節中有說明。
有些語句可以使用子查詢。對這些語句的類型基本沒有限定。子查詢可以包括普通SELECT可以包括的任何關鍵詞或子句:DISTINCT, GROUP BY, ORDER BY, LIMIT, 聯合, 索引提示, UNION結構化, 評注和函數等。
有一個限定是,一個子查詢的外部語句必須是以下語句之一:SELECT, INSERT, UPDATE, DELETE, SET或DO。還有一個限定是,目前,您不能在一個子查詢中修改一個表,又在同一個表中選擇。這適用于DELETE, INSERT, REPLACE和UPDATE語句。在附錄I:特性限制中給出了對子查詢使用的更綜合的討論。