LEFT JOIN 中 ON 与 WHERE 条件的区别
LEFT JOIN 中 ON 与 WHERE 条件的区别
核心区别
- ON 条件:在生成临时表时进行筛选,然后执行连接操作
- WHERE 条件:在连接完成生成临时表后,对整个结果集进行筛选
详细说明
LEFT JOIN ON 的执行逻辑
- 先根据 ON 条件筛选右表数据
- 再与左表进行连接
- 左表所有记录都会保留,未匹配的右表字段填充 NULL
LEFT JOIN WHERE 的执行逻辑
- 先执行完整的 LEFT JOIN 操作
- 再对连接结果应用 WHERE 条件筛选
- 可能会过滤掉左表的某些记录
实例对比
测试数据
-- 左表 T
SELECT 1 a, 77 b FROM dual
UNION ALL
SELECT 2 a, 88 b FROM dual
UNION ALL
SELECT 3 a, 99 b FROM dual;
-- 右表 Q
SELECT 1 c, 'VVV' d FROM dual
UNION ALL
SELECT 2 c, 'EEE' d FROM dual;
使用 ON 条件筛选
SELECT T.*, Q.*
FROM (
SELECT 1 a, 77 b FROM dual
UNION ALL
SELECT 2 a, 88 b FROM dual
UNION ALL
SELECT 3 a, 99 b FROM dual
) T
LEFT JOIN (
SELECT 1 c, 'VVV' d FROM dual
UNION ALL
SELECT 2 c, 'EEE' d FROM dual
) Q
ON T.a = Q.c AND T.a > 1;
结果:
a b c d
1 77 null null
2 88 2 EEE
3 99 null null
解释: ON 条件 T.a > 1 只影响连接匹配,左表所有记录仍然保留。
使用 WHERE 条件筛选
SELECT T.*, Q.*
FROM (
SELECT 1 a, 77 b FROM dual
UNION ALL
SELECT 2 a, 88 b FROM dual
UNION ALL
SELECT 3 a, 99 b FROM dual
) T
LEFT JOIN (
SELECT 1 c, 'VVV' d FROM dual
UNION ALL
SELECT 2 c, 'EEE' d FROM dual
) Q
ON T.a = Q.c
WHERE T.a > 1;
结果:
a b c d
2 88 2 EEE
3 99 null null
解释: WHERE 条件过滤掉了 T.a = 1 的记录。
不加额外条件的对比
-- 标准 LEFT JOIN
SELECT T.*, Q.*
FROM T LEFT JOIN Q ON T.a = Q.c;
结果:
a b c d
1 77 1 VVV
2 88 2 EEE
3 99 null null
总结
| 类型 | 执行时机 | 对左表的影响 | 使用场景 |
|---|---|---|---|
| ON 条件 | 连接时筛选 | 保留所有记录 | 控制连接匹配规则 |
| WHERE 条件 | 连接后筛选 | 可能过滤记录 | 过滤最终结果集 |
建议: 根据业务需求选择合适的筛选方式,理解两者的执行时机差异是关键。


浙公网安备 33010602011771号