子查詢是 SQL 進階查詢的基石,廣泛應用於 WHERE、HAVING、DML 等子句。本文深入解析子查詢的嵌套規則、適用場景、集合運算與分頁查詢最佳實踐。
內層查詢先執行,結果集作為外層查詢的條件或資料來源:
SELECT *
FROM (SELECT col1, col2 FROM table1 WHERE cond1)
WHERE cond2;
INSERT/UPDATE/DELETE 的值來源| 運算子 | 說明 |
|---|---|
| UNION | 並集,自動去重 |
| UNION ALL | 並集,保留重複 |
| MINUS | 差集 (第一個結果集減去第二個) |
| INTERSECT | 交集 |
注意:參與運算的兩個查詢欄位數、類型必須一致。
IN、ANY、ALL 或 EXISTSSELECT title, AVG(salary)
FROM s_emp
GROUP BY title
HAVING AVG(salary) = (
SELECT MIN(AVG(salary))
FROM s_emp
GROUP BY title
);
SELECT cty_name
FROM city
WHERE st_code IN (
SELECT st_code
FROM state
WHERE st_name = 'TENNESSEE'
AND city.cnt_code = state.cnt_code
);
說明:父查詢的 city.cnt_code 在子查詢中被引用,子查詢對每一行父查詢結果執行一次 (相關子查詢)。
Oracle ROWNUM 只能用 <=,不能直接用 >。標準寫法:
SELECT *
FROM (
SELECT ROWNUM AS rn, t.*
FROM (
SELECT field_list
FROM table_name
WHERE cond1
ORDER BY cond2
) t
WHERE ROWNUM <= 100
)
WHERE rn > 80
ORDER BY cond3;
此寫法相容 Oracle 10g 以上版本,12c 可改用 OFFSET ... FETCH 語法更簡潔。