SQL 相關子查詢

摘要:在本教學中,您將了解 SQL 相關子查詢,這是一種會使用外部查詢值的子查詢

SQL 相關子查詢簡介

讓我們從一個範例開始。

請參閱範例資料庫中的以下 employees 表格

SQL Correlated Subquery: Employees Table

以下查詢會找出薪水高於所有員工平均薪水的員工

SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary
FROM
    employees
WHERE
    salary > (SELECT 
            AVG(salary)
        FROM
            employees);
Code language: SQL (Structured Query Language) (sql)
SQL Subquery example

在這個範例中,子查詢被用在 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)

以下是輸出結果

SQL Correlated Subquery Example

在這個範例中,外部查詢是

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)

輸出結果是

SQL Correlated Subquery in SELECT clause

對於每位員工,資料庫系統都必須執行相關子查詢一次,以計算該員工部門的平均薪水。

使用 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 Correlated Subquery with EXISTS operator

在本教學中,您已了解 SQL 相關子查詢,以及如何應用它來形成複雜的查詢。

這個教學對您有幫助嗎?