SQL Correlated Subquery

摘要:在本教程中,你将学习 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 相关子查询及其在复杂查询中的应用方法。

本教程是否有所帮助?