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