推荐答案
相关子查询和非相关子查询的主要区别在于子查询是否依赖于外部查询的结果。
相关子查询:子查询的执行依赖于外部查询的每一行数据。也就是说,外部查询的每一行都会触发一次子查询的执行。相关子查询通常用于需要逐行比较的场景。
非相关子查询:子查询的执行不依赖于外部查询的结果。子查询可以独立执行,并且只执行一次。非相关子查询通常用于需要一次性获取某些数据的场景。
本题详细解读
相关子查询 (Correlated Subquery)
相关子查询是指子查询中的条件依赖于外部查询的当前行。这意味着子查询会为外部查询的每一行执行一次。相关子查询通常用于需要逐行比较的场景。
示例:
SELECT e1.employee_name
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);在这个例子中,子查询 SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id 依赖于外部查询中的 e1.department_id。因此,子查询会为外部查询中的每一行执行一次。
非相关子查询 (Non-Correlated Subquery)
非相关子查询是指子查询中的条件不依赖于外部查询的结果。子查询可以独立执行,并且只执行一次。非相关子查询通常用于需要一次性获取某些数据的场景。
示例:
SELECT employee_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'Sales'
);在这个例子中,子查询 SELECT department_id FROM departments WHERE department_name = 'Sales' 不依赖于外部查询的结果。子查询只执行一次,返回 Sales 部门的 department_id,然后外部查询使用这个结果来过滤 employees 表中的数据。
总结
- 相关子查询:子查询依赖于外部查询的每一行数据,逐行执行。
- 非相关子查询:子查询独立于外部查询,只执行一次。