SQL子查询实战:相关子查询vs非相关子查询,用法解析 前言子查询是SQL进阶的核心简单说就是SQL中嵌套SQL。日常开发中复杂筛选、批量匹配、嵌套统计都需要用到子查询。很多新手只会写简单子查询分不清相关子查询和非相关子查询的区别不知道什么时候用哪种导致代码冗余、性能低下。一、子查询基础概念外层SQL父查询括号内嵌套的SQL子查询。分类核心依据子查询是否依赖父查询的字段。不依赖 非相关子查询独立执行依赖 相关子查询逐行执行。二、非相关子查询独立子查询核心特点子查询完全独立不引用父查询的任何字段只会执行一次执行效率高。常用场景固定条件筛选、批量匹配、获取统计值、IN / EXISTS 固定值匹配。实战案例-- 案例查询有订单的所有用户非相关子查询 SELECT * FROM user WHERE id IN (SELECT DISTINCT user_id FROM order);解析子查询单独执行查询出所有有订单的用户ID再给父查询筛选子查询只执行1次。三、相关子查询关联子查询核心特点子查询依赖父查询字段无法独立运行会随着父查询的每一行数据逐行循环执行数据量大时性能较差。常用场景逐行匹配统计、单行数据校验、复杂行级筛选。实战案例-- 案例查询每个用户的订单数量大于0的用户 SELECT * FROM user u WHERE EXISTS ( SELECT 1 FROM order o WHERE o.user_id u.id );解析子查询引用了父查询的 u.id 字段依赖父查询父查询每遍历一行子查询执行一次。四、两种子查询核心区别对比对比维度非相关子查询相关子查询执行依赖独立执行不依赖父查询依赖父查询字段无法独立运行执行次数仅执行1次父查询多少行执行多少次执行性能高推荐优先使用低大数据量慎用五、子查询开发规范与优化1、优先使用非相关子查询尽量避免循环执行的相关子查询2、大数据量场景相关子查询可改写为 LEFT JOIN 关联查询大幅提升性能3、子查询尽量返回固定字段禁止 SELECT *减少数据传输开销。