SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?
封面图
•
2025-12-29
•
MySQL
225
0
0
0
在SQL语句中,**相关子查询(Correlated Subquery)** 和 **非相关子查询(Non-Correlated Subquery)** 是两种不同类型的子查询,它们的主要区别在于**是否依赖于外部查询的值**。 --- ### 一、非相关子查询(Non-Correlated Subquery) #### 定义: 子查询**不依赖于外部查询的任何值**,它可以在外部查询执行前独立完成。也就是说,子查询可以被单独执行,不需要外部查询的上下文。 #### 特点: - 子查询与外部查询**没有直接关联**。 - 可以**先执行子查询**,再用其结果去匹配外部查询的条件。 - 执行顺序通常是:**先执行子查询,再执行外部查询**。 #### 示例: ```sql SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 在这个例子中,子查询 `(SELECT AVG(salary) FROM employees)` 是一个非相关子查询,因为它不依赖于外部查询中的任何字段,可以直接计算出平均工资。 --- ### 二、相关子查询(Correlated Subquery) #### 定义: 子查询**依赖于外部查询的某些值**,每次外部查询的一行数据都会触发一次子查询的执行。 #### 特点: - 子查询中包含对**外部查询字段的引用**。 - 子查询不能独立执行,必须和外部查询一起执行。 - 执行顺序通常是:**外部查询一行一行地处理,每行都执行一次子查询**。 #### 示例: ```sql SELECT e1.name, e1.salary FROM employees e1 WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id); ``` 在这个例子中,子查询 `(SELECT AVG(e2.salary) ... WHERE e2.department_id = e1.department_id)` 是一个相关子查询,因为它引用了外部查询中的 `e1.department_id` 字段。 --- ### 三、总结对比 | 特性 | 非相关子查询(Non-Correlated) | 相关子查询(Correlated) | |---------------------|----------------------------------------|--------------------------------------| | 是否依赖外部查询? | ❌ 不依赖 | ✅ 依赖 | | 能否独立执行? | ✅ 可以 | ❌ 不能 | | 执行顺序 | 先执行子查询,再执行外部查询 | 外部查询一行一行执行,每行执行一次子查询 | | 性能影响 | 通常效率较高 | 通常效率较低(可能需要多次执行) | --- ### 四、使用建议 - 如果你只需要一个固定值来比较(如平均值、最大值等),使用**非相关子查询**更高效。 - 如果你需要根据外部查询的每一行进行不同的计算(如按部门计算平均工资),则需要使用**相关子查询**。 --- 如有具体场景或示例,我可以帮你进一步分析哪种方式更适合。
上一篇:
SQL语言包括哪几部分?每部分都有哪些操作关键字?
下一篇:
mysql 主键、外键和索引的区别?
标题录入,一次不能超过6条
留言
评论