什么是mysql相关子查询

例:

php 复制代码
SELECT * FROM cmf_fast_register r WHERE r.icp_status = '0' AND EXISTS ( SELECT * FROM cmf_icp i WHERE (i.app_id = r.app_id) ) 

一、结论:里面包含子查询(相关子查询)

整条 SQL 分为两部分:

  1. 外层主查询:SELECT * FROM cmf_fast_register r WHERE ...
  2. 内层 EXISTS(...) 括号里的一整段,就是子查询
sql 复制代码
-- 这一段就是子查询
SELECT * FROM `cmf_icp` `i` WHERE ( i.app_id = r.app_id )

二、什么是「相关子查询」

它不是普通子查询,是相关子查询 :

子查询里用到了外层表的别名 r(r.app_id),子查询不能独立执行,必须依赖外层每一行的数据。

执行逻辑拆解:

  1. 数据库先遍历外层 cmf_fast_register 每一条记录 r
  2. 拿当前这条 r 的 app_id 丢进内层子查询
  3. 去 cmf_icp 匹配有没有 i.app_id = 当前r.app_id 的数据
  4. EXISTS 只判断「有没有匹配结果」,有就保留这条 r,没有就过滤掉
  5. 再叠加条件 r.icp_status = 0 双重筛选

三、EXISTS 的特点(对比 IN / JOIN)

  1. 只判断存在,不返回数据
    你里面写 SELECT * 其实没用,推荐改成 SELECT 1,性能更好,逻辑不变:

    sql 复制代码
    EXISTS ( SELECT 1 FROM `cmf_icp` `i` WHERE i.app_id = r.app_id )
  2. 不会产生重复行
    即使一条 r 对应几十条 icp,EXISTS 只标记"存在",外层 r 只会输出一次,完美解决你之前一对多 JOIN 重复数据的问题。

  3. 匹配到第一条 icp 就立刻停止检索,大数据量性能优于 INNER JOIN。

四、整条 SQL 语义翻译

查询所有满足两个条件的 cmf_fast_register 数据:

  1. 自身字段 icp_status = 0
  2. 在 cmf_icp 表中存在同 app_id 的关联记录

五、补充区分概念

  1. 子查询 :写在 () 内部、嵌套在主查询里的查询语句;
  2. 相关子查询:子查询引用了外层查询的表/字段;
  3. 普通子查询(非相关):不依赖外层,可以单独执行,例如 WHERE app_id IN (SELECT app_id FROM cmf_icp)。
相关推荐
SelectDB3 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶3 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶5 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风5 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio6 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲10 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋10 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子11 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T12 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡12 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql