sql 子查詢詳解及示例
什么是 SQL 子查詢?
子查詢,也稱為內部查詢或嵌套查詢,是指嵌入在另一個 SQL 查詢中的查詢。它用括號括起來,先于外部查詢執行,并為外部查詢提供結果用于進一步處理。
子查詢類型
- 單行子查詢: 返回單行結果,通常與 =、 等比較運算符結合使用。
示例: 查找薪資最高的員工姓名:
select name FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
- 多行子查詢: 返回多行結果,通常與 IN、ANY、ALL 等運算符結合使用。
示例: 查找在員工數超過 5 人的部門工作的員工:
SELECT name FROM employees WHERE departmentid IN (SELECT departmentid FROM departments WHERE members > 5);
- 相關子查詢: 引用外部查詢中的列,針對外部查詢的每一行重復執行。
示例: 查找薪資高于所在部門平均薪資的員工:
SELECT name, salary FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE departmentid = e.departmentid);
- 嵌套子查詢: 包含另一個子查詢的子查詢。
示例: 查找平均薪資超過 50,000 美元的部門:
SELECT departmentname FROM departments WHERE departmentid IN ( SELECT departmentid FROM employees WHERE salary > (SELECT AVG(salary) FROM employees) );
子查詢應用場景
- 數據過濾: 根據特定條件過濾數據行。
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);
- 數據比較: 比較不同表中的數據。
SELECT name FROM employees WHERE departmentid = (SELECT id FROM departments WHERE name = 'HR');
- 數據聚合: 執行高級聚合操作。
SELECT departmentid, (SELECT COUNT(*) FROM employees WHERE departmentid = d.id) AS employeecount FROM departments d;
- 動態更新: 基于子查詢動態更新或刪除數據行。
UPDATE Employees SET Bonus = 500 WHERE Salary > (SELECT AVG(Salary) FROM Employees);
子查詢優勢
- 模塊化: 將復雜查詢分解成更小、更易管理的單元。
- 可讀性: 提升查詢邏輯的清晰度。
- 靈活性: 可用于 SELECT、WHERE、FROM 和 HAVING 子句。
子查詢局限性
- 性能: 子查詢,尤其是相關子查詢,多次執行可能導致性能下降。
- 復雜性: 深度嵌套的子查詢可能難以閱讀和調試。
- 優化挑戰: 有時,使用連接可以獲得更高的效率。
總結
子查詢是 SQL 中強大的工具,用于將復雜邏輯分解成可管理的單元,實現動態數據分析和數據操作。然而,需要權衡子查詢與連接等替代方案,以獲得最佳查詢性能。