SQL 相关子查询
相关子查询用于逐行处理。每个子查询对外部查询的每一行执行一次。
对于父语句处理的每一行,对相关子查询进行一次评估。父语句可以是SELECT 、 UPDATE或DELETE语句。
SELECT column1, column2, ....
FROM table1 outer
WHERE column1 operator
(SELECT column1, column2
FROM table2
WHERE expr1 =
outer.expr2);
相关子查询是读取表中每一行并将每一行中的值与相关数据进行比较的一种方法。每当子查询必须为主查询考虑的每个候选行返回不同的结果或结果集时,都会使用它。换句话说,您可以使用相关子查询来回答多部分问题,其答案取决于父语句处理的每一行中的值。
嵌套子查询与相关子查询:
对于普通的嵌套子查询,内部SELECT查询首先运行并执行一次,返回主查询使用的值。但是,相关子查询对外部查询考虑的每个候选行执行一次。换句话说,内部查询由外部查询驱动。
注意:您还可以在相关子查询中使用ANY和ALL运算符。
相关子查询示例:查找所有收入高于其部门平均工资的员工。
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary >
(SELECT AVG(salary)
FROM employees
WHERE department_id =
outer.department_id);
相关性的其他用途是在UPDATE和DELETE
相关更新:
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column =
alias2.column);
使用相关子查询根据另一个表中的行更新一个表中的行。
相关删除:
DELETE FROM table1 alias1
WHERE column1 operator
(SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column);
使用相关子查询根据另一个表中的行删除一个表中的行。
使用 EXISTS 运算符:
EXISTS运算符测试子查询的结果集中是否存在行。如果找到子查询行值,则将条件标记为TRUE ,并且不会在内部查询中继续搜索,如果未找到,则将条件标记为FALSE ,并且在内部查询中继续搜索。
使用 EXIST运算符的示例:
查找至少有一个人向他们报告的员工。
SELECT employee_id, last_name, job_id, department_id
FROM employees outer
WHERE EXISTS ( SELECT ’X’
FROM employees
WHERE manager_id =
outer.employee_id);
输出 :
使用 NOT EXIST运算符的示例:
查找所有没有员工的部门。
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT ’X’
FROM employees
WHERE department_id
= d.department_id);
输出 :