文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.2.15 子查詢

子查詢是另一個陳述式內的 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 可以包含的許多關鍵字或子句:DISTINCTGROUP BYORDER BYLIMIT、聯結、索引提示、UNION 建構、註解、函式等等。

TABLEVALUES 陳述式可以在子查詢中使用。使用 VALUES 的子查詢通常是更冗長的子查詢版本,可以使用集合符號,或使用 SELECTTABLE 語法,以更緊湊的方式重新撰寫;假設表格 ts 是使用陳述式 CREATE TABLE ts VALUES ROW(2), ROW(4), ROW(6) 建立的,此處顯示的陳述式都等效

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 子查詢的範例顯示在後面的章節中。

子查詢的外部陳述式可以是以下任何一個:SELECTINSERTUPDATEDELETESETDO

有關最佳化工具如何處理子查詢的資訊,請參閱第 10.2.2 節「最佳化子查詢、衍生表格、檢視參考和通用表格運算式」。有關子查詢使用限制(包括某些形式子查詢語法的效能問題)的討論,請參閱第 15.2.15.12 節「子查詢的限制」