-- 原始低效子查询SELECT*FROM users
WHERE user_id IN(SELECT user_id FROM orders WHERE amount >100);-- 优化后(EXISTS)SELECT*FROM users u
WHEREEXISTS(SELECT1FROM orders o
WHERE o.user_id = u.user_id
AND o.amount >100);-- 优化后(JOIN)SELECTDISTINCT u.*FROM users u
JOIN orders o
ON u.user_id = o.user_id
AND o.amount >100;
6. 表格总结:JOIN 与子查询对比
维度
关联查询(JOIN)
子查询
定义
通过关联条件组合多个表的数据。
将一个查询的结果作为另一个查询的条件或数据源。
语法结构
SELECT ... FROM table_a JOIN table_b ON condition
SELECT ... FROM table WHERE column IN/EXISTS (子查询)
性能
通常高效(尤其对大数据量)。
可能低效(如 IN 子查询,需优化为 EXISTS 或 JOIN)。
可读性
高,直接表达关联关系。
低,嵌套结构可能复杂。
适用场景
简单的表间关联、需要组合多表数据。
复杂条件、分步查询、动态条件。
锁与资源
可控制锁范围,资源占用明确。
可能增加资源开销(如嵌套多层查询)。
优化建议
优先使用 JOIN 处理多表关联,利用索引。
避免大结果集的 IN 子查询,改用 EXISTS 或 JOIN。
7. 关键注意事项
性能优化:
大数据量时优先使用 JOIN,避免低效的 IN 子查询。
使用 EXISTS 替代 IN(尤其当子查询可能返回大量数据时)。
可读性优先:
简单关联用 JOIN,复杂逻辑用子查询(如需分步处理)。
索引优化:
在关联列(如 user_id)和子查询的条件列上添加索引。
避免嵌套过深:
子查询嵌套层级过多可能导致性能下降,可拆分为 JOIN 或临时表。
8. 示例代码总结
关联查询(JOIN)
-- 左连接查询用户及其订单(包括无订单的用户)SELECT users.name, orders.product
FROM users
LEFTJOIN orders
ON users.user_id = orders.user_id;
子查询(优化后)
-- 使用 EXISTS 替代 INSELECT name
FROM users u
WHEREEXISTS(SELECT1FROM orders o
WHERE o.user_id = u.user_id
);