摘要:在本教學中,您將了解 SQL 相關子查詢,這是一種會使用外部查詢值的子查詢。
SQL 相關子查詢簡介
讓我們從一個範例開始。
請參閱範例資料庫中的以下 employees
表格

以下查詢會找出薪水高於所有員工平均薪水的員工
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
WHERE
salary > (SELECT
AVG(salary)
FROM
employees);
Code language: SQL (Structured Query Language) (sql)

在這個範例中,子查詢被用在 WHERE
子句中。您可以從這個查詢中看到一些重點
首先,您可以獨立執行子查詢,該子查詢會傳回所有員工的平均薪資。
SELECT
AVG(salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
其次,資料庫系統只需要評估子查詢一次。
第三,外部查詢會使用子查詢傳回的結果。外部查詢的值取決於子查詢。然而,子查詢不依賴於外部查詢。有時,我們稱這種子查詢為簡單子查詢。
與簡單子查詢不同,相關子查詢是一種會使用外部查詢值的子查詢。此外,相關子查詢可能會針對外部查詢選取的每個資料列評估一次。因此,使用相關子查詢的查詢可能會很慢。
相關子查詢也稱為重複子查詢或同步子查詢。
SQL 相關子查詢範例
讓我們看看更多相關子查詢的範例,以便更好地理解它們。
WHERE 子句中的 SQL 相關子查詢範例
以下查詢會找出所有薪水高於其部門員工平均薪水的員工
SELECT
employee_id,
first_name,
last_name,
salary,
department_id
FROM
employees e
WHERE
salary > (SELECT
AVG(salary)
FROM
employees
WHERE
department_id = e.department_id)
ORDER BY
department_id ,
first_name ,
last_name;
Code language: SQL (Structured Query Language) (sql)
以下是輸出結果

在這個範例中,外部查詢是
SELECT
employee_id,
first_name,
last_name,
salary,
department_id
FROM
employees e
WHERE
salary >
...
Code language: SQL (Structured Query Language) (sql)
相關子查詢是
SELECT
AVG( list_price )
FROM
products
WHERE
category_id = p.category_id
Code language: SQL (Structured Query Language) (sql)
對於每位員工,資料庫系統都必須執行相關子查詢一次,以計算該員工所在部門的員工平均薪水。
SELECT 子句中的 SQL 相關子查詢範例
以下查詢會傳回員工及其部門所有員工的平均薪水
SELECT
employee_id,
first_name,
last_name,
department_name,
salary,
(SELECT
ROUND(AVG(salary),0)
FROM
employees
WHERE
department_id = e.department_id) avg_salary_in_department
FROM
employees e
INNER JOIN
departments d ON d.department_id = e.department_id
ORDER BY
department_name,
first_name,
last_name;
Code language: SQL (Structured Query Language) (sql)
輸出結果是

對於每位員工,資料庫系統都必須執行相關子查詢一次,以計算該員工部門的平均薪水。
使用 EXISTS 運算子的 SQL 相關子查詢範例
我們經常將相關子查詢與 EXISTS
運算子一起使用。例如,以下查詢會傳回所有沒有家屬的員工
SELECT
employee_id,
first_name,
last_name
FROM
employees e
WHERE
NOT EXISTS( SELECT
*
FROM
dependents d
WHERE
d.employee_id = e.employee_id)
ORDER BY first_name ,
last_name;
Code language: SQL (Structured Query Language) (sql)
下圖顯示輸出結果

在本教學中,您已了解 SQL 相關子查詢,以及如何應用它來形成複雜的查詢。
這個教學對您有幫助嗎?