MySQL常用的几种连接(JOIN)方式总结

 更新时间:2025年07月15日 10:03:51   作者:码上有约  
MySQL常用JOIN类型包括INNER JOIN(返回匹配记录)、LEFT JOIN(左表全显示,右表无匹配则为NULL)、RIGHT JOIN(右表全显示)、FULL OUTER JOIN(需用UNION模拟),默认为INNER JOIN,选择时需根据数据完整性和业务需求,合理使用索引以优化性能

下面详细介绍一下 MySQL 中常用的几种连接(JOIN)方式,以帮助你理解它们各自的特点、适用情境以及实际使用方法:

1. INNER JOIN(内连接)

定义:

  • INNER JOIN 返回两个表中满足连接条件(ON 子句)匹配的记录。
  • 如果某一行在任一张表中没有对应匹配,则不会出现在结果集中。
  • 实际上,当仅写 JOIN 时,MySQL 默认就是执行 INNER JOIN

使用场景:

当你只需要两个表中都有对应数据的行时(例如:从订单表和客户表中仅返回存在订单的客户信息),内连接是首选。

示例代码:

SELECT A.*, B.*
FROM tableA AS A
INNER JOIN tableB AS B ON A.id = B.aid;

该查询返回 tableA 与 tableB 中,A.id 等于 B.aid 的所有记录。

2. LEFT JOIN(左外连接)

定义:

  • LEFT JOIN(或称 LEFT OUTER JOIN)返回左表(FROM 子句中第一个表)的所有记录,即使右表中相关联的数据不存在。
  • 如果右表没有匹配记录,其对应字段会返回 NULL。

使用场景:

  • 当需要显示左表中的所有记录,同时希望附加右表中的信息(如果存在匹配),例如查询所有客户信息以及他们可能的订单,即使部分客户没有订单。

示例代码:

SELECT A.*, B.*
FROM tableA AS A
LEFT JOIN tableB AS B ON A.id = B.aid;

此查询确保了 tableA 中的每条记录都会出现在结果中,而 tableB 的数据在无匹配时显示 NULL。

3. RIGHT JOIN(右外连接)

定义:

  • RIGHT JOIN(或 RIGHT OUTER JOIN)与 LEFT JOIN 类似,但它返回的是右表(JOIN 子句中第二个表)的所有记录。
  • 如果左表中没有匹配,左表对应的字段将返回 NULL。

使用场景:

  • 当业务逻辑要求必须显示右侧表中的所有记录时使用。
  • 由于通常可以通过交换左右两表的位置来用 LEFT JOIN 实现同样效果,RIGHT JOIN 相对较少使用。

示例代码:

SELECT A.*, B.*
FROM tableA AS A
RIGHT JOIN tableB AS B ON A.id = B.aid;

该查询确保 tableB 中的每条记录都显示出来,而 tableA 中没有匹配的部分以 NULL 填充。

4. FULL OUTER JOIN(全外连接)

定义:

  • FULL OUTER JOIN 会返回两个表中所有的记录,也就是说,不仅返回匹配的部分,还会返回左表或右表中没有匹配的记录,并用 NULL 填充缺失部分。
  • 需要注意的是,MySQL 不直接支持 FULL OUTER JOIN。

使用场景与实现方法:

  • 如果需要获取两个表中所有数据,可以采用 LEFT JOIN 和 RIGHT JOIN 的 UNION 操作来实现全外连接:
SELECT A.*, B.*
FROM tableA AS A
LEFT JOIN tableB AS B ON A.id = B.aid
UNION
SELECT A.*, B.*
FROM tableA AS A
RIGHT JOIN tableB AS B ON A.id = B.aid;

这种方法可以返回两个表中所有记录,不过在大数据量时可能会有性能影响,需要进一步优化。

小结与注意事项

默认行为:

  • 不写限定关键字的 JOIN 默认为 INNER JOIN,即只返回两个表中都有匹配的记录。

选择时机:

  • INNER JOIN:用于只需要匹配数据的场景。
  • LEFT JOIN:保证左侧表中所有数据均显示;右侧表无匹配数据时,字段返回 NULL。
  • RIGHT JOIN:保证右侧表中所有数据均显示(实际应用中可通过交换表顺序转换为 LEFT JOIN);
  • FULL OUTER JOIN:返回所有数据,但 MySQL 需要通过 UNION 实现。

性能考虑:

  • 在涉及多个大表连接时,建议对连接字段设置索引,确保查询高效并降低内存占用。
  • 并且在设计 SQL 查询时,清楚了解各类 JOIN 的执行机制有助于优化查询性能。

这些连接方式的具体表现往往可以用 Venn 图来直观说明,比如 INNER JOIN 只包含两个表的交集,而 LEFT JOIN 则是左表的全集与右表的交集,右部分没有匹配部分则显示为空值。

各位在实际项目中选择合适的 JOIN 类型时,建议根据数据完整性和业务需求进行权衡。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL学习(七):Innodb存储引擎索引的实现原理详解

    MySQL学习(七):Innodb存储引擎索引的实现原理详解

    这篇文章主要介绍了Innodb存储引擎索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MySQL数据库MyISAM存储引擎转为Innodb的方法

    MySQL数据库MyISAM存储引擎转为Innodb的方法

    mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb,这篇文章主要介绍了MySQL数据库MyISAM存储引擎转为Innodb的方法,需要的朋友可以参考下
    2014-06-06
  • MySQL 内置函数指南之日期、字符串、数学函数实战

    MySQL 内置函数指南之日期、字符串、数学函数实战

    本文基于实战场景,全面拆解 MySQL 常用内置函数,涵盖日期、字符串、数学、其他工具类函数,附带详细案例和避坑要点,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 4种MySQL数据同步ES方案详解

    4种MySQL数据同步ES方案详解

    这篇文章主要给大家分享介绍了关于4种MySQL数据同步ES方案的相关资料,MySQL是一种常用的关系型数据库,而Elasticsearch是一种为搜索和分析而设计的分布式全文搜索引擎,需要的朋友可以参考下
    2023-10-10
  • mysql如何取分组之后最新的数据

    mysql如何取分组之后最新的数据

    开发中经常会遇到,分组查询最新数据的问题,下面这篇文章主要给大家介绍了关于mysql如何取分组之后最新的数据的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 详解windows下mysql的主从同步

    详解windows下mysql的主从同步

    本文主要对windows下的mysql主从同步进行详细介绍。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • MySQL 数据库基础入门从概念到实战

    MySQL 数据库基础入门从概念到实战

    本文覆盖了MySQL的核心基础:从数据库概念、主流数据库对比,到 MySQL的安装连接、实战操作和架构解析,适合零基础初学者快速入门,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • MySQL字符串转数字的3种方式实例

    MySQL字符串转数字的3种方式实例

    这篇文章主要给大家介绍了关于MySQL字符串转数字的3种方式,在使用mysql中经常遇到要将字符串数字转换成可计算数字,文中给出了详细的代码示例和图文介绍,需要的朋友可以参考下
    2023-08-08
  • MySQL语句汇总整理

    MySQL语句汇总整理

    这篇文章主要给大家分享的是MySQL语句汇总整理,围绕MySQL语句的相关资料对其进行整理,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-12-12
  • Mysql定时数据库备份实现的保姆级教程

    Mysql定时数据库备份实现的保姆级教程

    数据备份本身主要是为了预防一些意外,例如服务器或者个人电脑的硬件故障、人为的错误操作等情况,这篇文章主要给大家介绍了Mysql定时数据库备份实现的保姆级教程,需要的朋友可以参考下
    2024-12-12

最新评论