子查詢(內部查詢)嵌套於外部查詢的 `WHERE`、`HAVING`、`FROM` 等子句中,可返回標量、行、列或表。善用子查詢能簡化複雜邏輯,但不當使用會導致效能災難。
| 類型 | 返回值 | 適用操作符 |
|---|---|---|
| 標量子查詢 | 單一值 | =, >, <, >=, <=, <> |
| 行子查詢 | 一行多列 | =, <>, IN, NOT IN |
| 列子查詢 | 單列多行 | IN, NOT IN, ANY, SOME, ALL |
| 表子查詢 | 多行多列 | IN, NOT IN, EXISTS, NOT EXISTS |
子查詢置於 `FROM` 子句中形成虛擬表:`SELECT * FROM (SELECT id FROM t1) AS derived_tbl;`。MySQL 5.6+ 支援物化優化。
-- 查詢杭州用戶所有訂單 (獨立子查詢)
SELECT order_id FROM orders WHERE customer_id IN (SELECT customer_id FROM users WHERE city='hangzhou');
-- 查詢訂單數多於 tx 用戶的客戶 (標量子查詢 + HAVING)
SELECT u.customer_id, u.city, COUNT(o.order_id) AS cnt
FROM users u JOIN orders o ON u.customer_id=o.customer_id
WHERE u.customer_id <> 'tx'
GROUP BY u.customer_id
HAVING cnt > (SELECT COUNT(*) FROM orders WHERE customer_id='tx');
-- 查詢訂單數多於 tx 或 9you 任一用戶的客戶 (ANY)
HAVING cnt > ANY (SELECT COUNT(*) FROM orders WHERE customer_id IN ('tx','9you') GROUP BY customer_id);