子查詢將一個 SELECT 的結果作為另一條 SQL 的中間條件。MySQL 支持標準 SQL 所有子查詢形式,並有擴展特性。本文涵蓋一般子查詢、標量子查詢、比較操作、與 JOIN 的抉擇。
查詢狀態正常(status=1)用戶發布的文章:
SELECT * FROM article WHERE uid IN (SELECT uid FROM user WHERE status=1)
子查詢先返回 uid 列表 (1,2),外層查詢等價於 WHERE uid IN (1,2)。

標量子查詢返回單一值(數字/字符串),可直接參與 = > < >= <= <> 比較,通常置於比較式右側。
SELECT * FROM article WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)
子查詢返回最大 uid=2,外層轉為 WHERE uid = 2。
另例:查詢某表列值等於另一表最大值:
SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)
許多場景子查詢與 JOIN 效果相近,但以下情況只能用子查詢:
WHERE col = (SELECT MAX(...) FROM ...)SELECT * FROM article AS t WHERE 2 = (SELECT COUNT(*) FROM article WHERE article.uid = t.uid)
查詢「發表恰好 2 篇文章的用戶的所有文章」。外層別名 t 被內層引用,JOIN 難以直接表達。

= > < 等比較運算符時,子查詢必須返回標量;唯一例外是 = 可配合行子查詢。JOIN 解決的優先考慮 JOIN,通常效率更高且可讀性更好。