Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

    • MySQL8一键安装配置优化
    • MySQL导出CSV格式解决乱码
    • MySQL 角色管理
    • MySQL网络抓包审计
    • MySQL性能压测
    • MySQL配合Consul读写分离
    • Gh-ost重建表,清除表碎片率
    • MySQL MGR配合MySQL-router实现innodb-cluster
    • MySQL 快速分析binlog定位问题
    • MySQL执行计划分析
    • DBA常用SQL和命令整理备查
    • mysqldump实时同步数据
    • MySQL的事务隔离级别
    • MySQL存储过程批量生成数据
    • MySQL insert on duplicate key update,replace into , insert ignore的理解
    • MySQL不同字符集之间的区别和选择
    • MySQL为什么有时候会选错索引
    • MySQL死锁问题
    • MySQL使用SQL语句查重去重
    • MySQLdump逻辑备份
    • MySQL主从跳过异常GITD
    • MySQL8设置slowlog记录所有语句
    • MySQL8快速克隆插件使用指南
    • MySQL8双1设置保障安全
    • MySQL锁
    • innodb cluster安装
    • MySQL里的left join 和right join以及inner join
    • optimize table和 analyze table的区别
    • MySQL 字段的区分度计算公式
    • MySQLReplicaSet 安装
    • 脚本实现MySQL ReplicaSet 高可用
    • MySQL 的Left join,Right join和Inner join 的区别
      • MySQL45讲学习笔记
    • Redis

    • Keydb

    • TiDB

    • MongoDB

    • Elasticsearch

    • Kafka

    • victoriametrics

    • BigData

    • Sqlserver

    • 数据库
    • MySQL
    Carry の Blog
    2024-01-26
    目录

    MySQL 的Left join,Right join和Inner join 的区别

    在 MySQL 中,LEFT JOIN、RIGHT JOIN 和 INNER JOIN 是常用的三种表连接方式,它们的主要区别在于结果集包含的记录范围。以下是详细的区别及各自的使用场景:


    # 1. INNER JOIN(内连接)

    • 定义:只返回两张表中符合连接条件的记录。
    • 结果集:仅包含在两张表中都有匹配的记录。
    • 场景:用于获取两个表中都存在的相关数据。

    # 示例:

    SELECT 
        a.id, a.name, b.order_id
    FROM 
        customers a
    INNER JOIN 
        orders b 
    ON 
        a.id = b.customer_id;
    
    1
    2
    3
    4
    5
    6
    7
    8
    • 结果:customers 表和 orders 表中,a.id = b.customer_id 的匹配记录。

    # 特点:

    • 如果记录在任意一张表中没有匹配,则不会出现在结果集中。
    • 执行效率较高,因为只处理匹配的记录。

    # 2. LEFT JOIN(左连接)

    • 定义:返回左表(LEFT)中的所有记录,即使右表中没有匹配的记录。
    • 结果集:包括左表中所有的记录和右表中匹配的记录。如果右表中没有匹配,则右表字段为 NULL。
    • 场景:用于需要保留左表所有数据的场景,即使没有对应的右表数据。

    # 示例:

    SELECT 
        a.id, a.name, b.order_id
    FROM 
        customers a
    LEFT JOIN 
        orders b 
    ON 
        a.id = b.customer_id;
    
    1
    2
    3
    4
    5
    6
    7
    8
    • 结果:customers 表中的所有记录,右表中没有匹配时,b.order_id 显示为 NULL。

    # 特点:

    • 确保左表的数据完整性。
    • 常用于找出左表中没有匹配右表的记录。

    # 3. RIGHT JOIN(右连接)

    • 定义:返回右表(RIGHT)中的所有记录,即使左表中没有匹配的记录。
    • 结果集:包括右表中所有的记录和左表中匹配的记录。如果左表中没有匹配,则左表字段为 NULL。
    • 场景:用于需要保留右表所有数据的场景,即使没有对应的左表数据。

    # 示例:

    SELECT 
        a.id, a.name, b.order_id
    FROM 
        customers a
    RIGHT JOIN 
        orders b 
    ON 
        a.id = b.customer_id;
    
    1
    2
    3
    4
    5
    6
    7
    8
    • 结果:orders 表中的所有记录,左表中没有匹配时,a.id 和 a.name 显示为 NULL。

    # 特点:

    • 确保右表的数据完整性。
    • 在实际应用中使用频率较低,可以通过调整表顺序和使用 LEFT JOIN 达到相同效果。

    # 区别总结

    特性 INNER JOIN LEFT JOIN RIGHT JOIN
    匹配规则 只返回两表匹配的记录 返回左表所有记录及匹配项 返回右表所有记录及匹配项
    左表保留 否 是 否
    右表保留 否 否 是
    不匹配时 不返回 右表字段为 NULL 左表字段为 NULL
    使用场景 获取交集 保留左表数据完整性 保留右表数据完整性

    # 4. 可视化理解

    假设我们有两张表:

    # customers(客户表)

    id name
    1 Alice
    2 Bob
    3 Charlie

    # orders(订单表)

    order_id customer_id
    101 1
    102 3
    103 4

    # 查询结果:

    1. INNER JOIN:

      • 匹配 customers.id = orders.customer_id
      • 结果:
        id name order_id
        1 Alice 101
        3 Charlie 102
    2. LEFT JOIN:

      • 保留 customers 表中的所有记录。
      • 结果:
        id name order_id
        1 Alice 101
        2 Bob NULL
        3 Charlie 102
    3. RIGHT JOIN:

      • 保留 orders 表中的所有记录。
      • 结果:
        id name order_id
        1 Alice 101
        3 Charlie 102
        NULL NULL 103

    # 5. 选择使用的关键

    • INNER JOIN:用于只需要匹配的数据。
    • LEFT JOIN:需要保留左表所有记录,即使没有匹配项。
    • RIGHT JOIN:需要保留右表所有记录(实际使用中较少)。

    通过理解这些区别,可以根据业务需求灵活选择合适的连接方式。

    上次更新: 4/24/2025

    ← 脚本实现MySQL ReplicaSet 高可用 MySQL45讲学习笔记→

    最近更新
    01
    tidb fast ddl
    04-04
    02
    TiDB配置文件调优 原创
    04-03
    03
    如何移除TiDB中的表分区 原创
    04-03
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式