LEFT JOIN 中 ON 与 WHERE 条件的区别

LEFT JOIN 中 ON 与 WHERE 条件的区别

核心区别

  • ON 条件:在生成临时表时进行筛选,然后执行连接操作
  • WHERE 条件:在连接完成生成临时表后,对整个结果集进行筛选

详细说明

LEFT JOIN ON 的执行逻辑

  1. 先根据 ON 条件筛选右表数据
  2. 再与左表进行连接
  3. 左表所有记录都会保留,未匹配的右表字段填充 NULL

LEFT JOIN WHERE 的执行逻辑

  1. 先执行完整的 LEFT JOIN 操作
  2. 再对连接结果应用 WHERE 条件筛选
  3. 可能会过滤掉左表的某些记录

实例对比

测试数据

-- 左表 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 条件 连接后筛选 可能过滤记录 过滤最终结果集

建议: 根据业务需求选择合适的筛选方式,理解两者的执行时机差异是关键。

posted @ 2025-05-29 19:05  灯熄帘摇月候身  阅读(81)  评论(0)    收藏  举报