子查詢是另一個陳述式內的 SELECT
陳述式。
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
結構、註解、函數等等。
TABLE
和 VALUES
陳述式可以用於子查詢中。使用 VALUES
的子查詢通常是子查詢的更詳細版本,可以使用集合表示法,或使用 SELECT
或 TABLE
語法更簡潔地重寫;假設使用陳述式 CREATE TABLE ts VALUES ROW(2), ROW(4), ROW(6)
建立了表格 ts
,此處顯示的陳述式均等效
SELECT * FROM tt
WHERE b > ANY (VALUES ROW(2), ROW(4), ROW(6));
SELECT * FROM tt
WHERE b > ANY (SELECT * FROM ts);
SELECT * FROM tt
WHERE b > ANY (TABLE ts);
TABLE
子查詢的範例顯示在以下各節中。
子查詢的外部陳述式可以是以下任一項:SELECT
、INSERT
、UPDATE
、DELETE
、SET
或 DO
。
如需有關最佳化器如何處理子查詢的資訊,請參閱第 10.2.2 節,「最佳化子查詢、衍生表、檢視表參考和通用表格運算式」。如需有關子查詢使用限制(包括某些形式子查詢語法的效能問題)的討論,請參閱第 15.2.15.12 節,「子查詢的限制」。