MySQL 关联子查询介绍

关联子查询就像"你问我答"的对话方式,其中内部查询(子查询)需要引用外部查询的信息才能回答问题。

生活化比喻

想象你在一个教室里:

  • 外部查询:老师依次点名每个学生(比如:张三、李四、王五…)
  • 子查询:被点名的学生要站起来回答:“我有没有交作业?”

这个"回答"过程就是关联子查询——每个学生(外部查询的每一行)被点名时,都要根据自己的情况(引用外部数据)回答一个问题。

主要特点

  1. 相互依赖:子查询需要用到外部查询的字段值才能执行
  2. 逐行处理:外部查询每检查一行数据,就要执行一次子查询
  3. 像过滤器:根据子查询的结果决定是否保留外部查询的当前行

简单示例

-- 找出有订单的客户
SELECT * 
FROM customers c
WHERE EXISTS (
    SELECT 1 
    FROM orders o 
    WHERE o.customer_id = c.id  -- 这里引用了外部查询的c.id
);

这个查询的工作方式:

  1. 从customers表取一个客户
  2. 检查orders表是否有这个客户的订单(通过customer_id匹配)
  3. 如果有(EXISTS返回真),就保留这个客户

与非关联子查询的区别

非关联子查询:子查询可以独立运行,像一次性查好所有答案清单

SELECT * 
FROM products
WHERE price > (SELECT AVG(price) FROM products);  -- 子查询不依赖外部查询

关联子查询:子查询必须知道外部查询的当前行才能回答,像动态问答

SELECT *
FROM employees e
WHERE salary > (
    SELECT AVG(salary) 
    FROM employees 
    WHERE department = e.department  -- 需要知道e.department才能计算
);

为什么叫"关联"?

因为子查询和外部查询通过某些字段"关联"在一起(就像用绳子绑着),必须一起处理,不能分开单独执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值