子查詢出現在 FROM 子句中稱為 FROM 子查詢(衍生表),出現在 WHERE 中配合 EXISTS 則用於存在性檢查。兩者機制與適用場景截然不同。
語法:
SELECT ... FROM (subquery) AS name ...
子查詢產生臨時表,必須指定別名(AS name)。可返回標量、列、行或表,但不能是相關子查詢。
表 table1(s1, s2):(1,5), (2,12), (3,20)。先將 s2 乘 2 再篩選:
SELECT s1, s2 FROM (SELECT s1, s2*2 AS s2 FROM table1) AS temp WHERE s1 > 1
返回 (2,24), (3,40)。衍生表 temp 讓複雜邏輯分步執行,結構清晰。
語法:
SELECT ... FROM table WHERE EXISTS (subquery)
邏輯:將主查詢每行數據代入子查詢驗證,若子查詢返回至少一行(TRUE)則保留該行。NOT EXISTS 則保留無匹配行。
查詢 article 中 uid 存在於 user 表的記錄:
SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)

第 4 條記錄 uid 在 user 中不存在,被過濾。若改用 NOT EXISTS 則保留第 4 條。
EXISTS (subquery) 僅返回 TRUE/FALSE,SELECT * 可替換為 SELECT 1,官方說明執行時忽略選擇列表。EXPLAIN 實測。EXISTS 常可用 JOIN、IN、條件表達式替代,具體哪種最優需視數據分佈、索引情況而定。