將一個SELECT嵌套在另一個查詢的WHERE/FROM/SELECT列表中。內層結果供外層作條件/數據源。
employee(num, d_id, name, age, sex, homeaddr)department(d_id, d_name, function, address)SELECT * FROM employee
WHERE d_id IN (SELECT d_id FROM department);
結果:員工部門ID在部門表中存在的行。NOT IN相反。**注意**:子查詢結果含NULL導致NOT IN永為假,慎用。
SELECT d_id, d_name FROM department
WHERE d_id != (SELECT d_id FROM employee WHERE age=24);
前提:子查詢**必須返回單行單列**(標量子查詢),否則報錯。適用於聚合函數結果比較。
SELECT * FROM employee
WHERE EXISTS (SELECT d_name FROM department WHERE d_id=1004);
TRUE/FALSETRUE,外層執行;無→FALSE,外層跳過組合條件:
SELECT * FROM employee
WHERE age > 24 AND EXISTS (SELECT d_name FROM department WHERE d_id=1003);
SELECT * FROM employee
WHERE d_id != ANY (SELECT d_id FROM department);
語義:**滿足子查詢結果集中任一值**即可。!= ANY 等價於 NOT IN(無NULL時)。
SELECT * FROM employee
WHERE d_id >= ALL (SELECT d_id FROM department);
語義:**滿足子查詢結果集中所有值**。示例:員工部門ID ≥ 所有部門ID → 僅最大部門ID的員工。
SELECT d_id FROM employee UNION SELECT d_id FROM department; -- 去重
SELECT d_id FROM employee UNION ALL SELECT d_id FROM department; -- 保留重複
非子查詢但常配合使用。UNION ALL性能遠優於UNION(無排序去重)。
JOIN或APPLY(MySQL不支持,用衍生表)WHERE col IN (SELECT ...) → INNER JOIN ... ON ...FROM (SELECT ...),加速複用IN (SELECT ... LIMIT n),早期版本用視圖/連接繞過LATERAL、IN/EXISTS 進一步優化子查詢是SQL表達複雜邏輯的強大工具,但濫用是性能殺手。理解六大類型語義、優化器行為、版本特性,配合EXPLAIN驗證,寫出優雅高效的查詢。