电话
400 9058 355
子查询是MySQL中解决多表逻辑依赖的刚需手段,必须用括号包裹且WHERE中的标量子查询须返回单值;IN适用于小结果集,EXISTS支持外层关联、适合大结果集;相关子查询有N×M性能风险。
子查询在 MySQL 中不是“可选技巧”,而是解决多表逻辑依赖的刚需手段。只要需要基于某次查询结果再做筛选、计算或关联,就绕不开它。
MySQL 要求所有子查询必须用 () 明确包裹,否则直接报错 ERROR 1064。另外,子查询内部不能直接使用 LIMIT(除非配合 ORDER BY 且位于派生表位置)。
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)
SELECT * FROM users WHERE id IN SELECT user_id FROM orders LIMIT 10(缺括号 + 多余 LIMIT)SELECT * FROM (SELECT * FROM logs ORDER BY ts DESC LIMIT 5) AS recent(仅限 FROM 子句中的派生表)当子查询出现在 WHERE 条件右侧(如 =、>、BETWEEN 等)时,它必须只返回一行一列,即“标量”。否则会触发 ERROR 1242: Subquery returns more than 1 row。
MAX() / MIN() / AVG() 聚合确保单值:WHERE salary > (SELECT AVG(salary) FROM employees)
LIMIT 1 强制截断(慎用,语义可能不严谨):WHERE dept_id = (SELECT id FROM departments WHERE name = 'HR' LIMIT 1)
WHERE status = (SELECT status FROM audits WHERE ref_id = 123)(若有多条 audit 记录就崩)IN 检查值是否在结果集中,适合子查询结果集小、主表大;EXISTS 是半连接语义,只关心是否存在匹配行,适合子查询结果集大、或需关联外层字段时。
SELECT name FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.id AND o.status = 'shipped' );
IN 子查询无法引用外部表字段:... WHERE id IN (SELECT customer_id FROM orders WHERE status = 'shipped')(只能查全部)EXISTS 子查询可关联外部字段(如上例中的 c.id),这是它不可替代的关键点IN 返回空集,EXISTS 返回 FALSE —— NULL 处理逻辑不同,会影响 NOT IN 的行为(NOT IN 遇到 NULL 直接整个条件为 UNKNOWN)子查询最易被忽略的其实是执行顺序:MySQL 通常先执行外层查询的驱动表,再对每一行执行子查询(相关子查询),这意味着 N×M 次扫描风险真实存在。别只盯着语法对不对,先看执行计划里的 DEPENDENT SUBQUERY 出现了几次。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...