博客
关于我
正确理解left join
阅读量:664 次
发布时间:2019-03-15

本文共 1214 字,大约阅读时间需要 4 分钟。


MySQL 左连接(left join)与优化器的行为

在MySQL数据库中,左连接(left join)与普通连接(join)有着显著的不同,这不仅影响查询结果的表现,也会影响优化器的处理方式。

1. 左连接的基本行为

左连接用于关联两个表,其中左表作为驱动表。结果集将包含左表的所有记录,而右表的记录仅在满足连接条件时才会显示。对于不满足条件的记录,左连接会将右表字段值替换为NULL,这正是我们通常所说的“左连接”的实际效果。

示例:

SELECT * FROM t1 left join t2 on t1.uname = t2.uname;

结果:

  • 左表t1的所有记录(5条)都会显示。
  • 对于每一条左表记录,右表t2中匹配的记录会显示,如果未匹配,则为NULL
  • 结果集总共有6条记录(5条匹配的和1条非匹配的NULL)。

2. 过滤条件的位置:on vs. where

在左连接中,将过滤条件放在on(连接条件)或where上,会产生不同的效果:

  • 条件放在on

    • 这种情况下,SQL实际上执行的是左连接。
    • 结果集包含左表全部记录,右表匹配的记录显示,未匹配时替换为NULL
    • 执行计划中,左表作为驱动表,与右表进行关联查询。
  • 条件放在where

    • 这时,左连接会被优化为普通连接(join)。
    • 结果是仅返回两表都满足过滤条件的记录。
    • 执行计划中,优化器会选择一个表作为驱动表,通常优先选择小表。
  • 示例:

    SELECT * FROM t1 left join t2 on t1.uname = t2.uname where t2.uage > 12;

    结果:

    • 原本的左连接被优化为普通连接,返回仅满足条件的1条记录。
    • 执行计划显示右表t2被优化为驱动表。

    3. 特殊情况:where 中右表字段为NULL

    在某些情况下,如果将右表字段is null的过滤条件放在where上,MySQL优化器不会将左连接改写为普通连接。这种行为可以被视为一种优化,避免了不必要的操作。

    示例:

    SELECT * FROM t1 left join t2 on t1.uname = t2.uname where t2.uage is null;

    结果:

    • SQL仍然执行左连接。
    • 执行计划显示左表作为驱动表,与右表关联。

    4. 总结

  • 左连接的结果:始终包含左表的所有记录,右表未匹配的记录为NULL
  • 过滤条件的位置on(连接条件)使用时,SQL执行左连接;where(过滤条件)使用时,SQL可能被优化为普通连接;
  • 优化器的行为:在某些情况下(如where过滤右表字段null),优化器不会改写左连接为普通连接;
  • 执行顺序:左连接执行时,左表优先作为驱动表;优化为普通连接时,优化器可能选择小表作为驱动表。
  • 理解这些行为对于数据库优化至关重要,尤其是在处理高性能查询和复杂的关联时,正确选择查询结构和过滤位置,可以显著提升数据库性能。

    转载地址:http://krxmz.baihongyu.com/

    你可能感兴趣的文章
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NUUO网络视频录像机 upload.php 任意文件上传漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>