0

0

mysql中JOIN操作连接表的几种方式与区别

P粉602998670

P粉602998670

发布时间:2026-01-29 10:37:34

|

427人浏览过

|

来源于php中文网

原创

INNER JOIN只返回两表联结字段值完全相等的记录,不满足条件的行全被过滤;LEFT JOIN保留左表全部行,右表无匹配则补NULL;RIGHT JOIN极少使用,可转为LEFT JOIN;MySQL不支持FULL OUTER JOIN,需用UNION模拟。

mysql中join操作连接表的几种方式与区别

INNER JOIN 只返回匹配的行,不满足条件的数据全被过滤

这是最常用的连接方式,INNER JOIN(或简写为 JON)只保留左表和右表中联结字段值完全相等的记录。一旦某行在任一表中找不到对应匹配,它就不会出现在结果里。

常见错误是误以为它会补空值或保留主表全部数据——其实不会。比如用 users 表关联 orders 表时,没下过单的用户根本不会出现。

  • 等价写法:JOININNER JOIN 完全相同,MySQL 中无区别
  • 性能上通常最优,因优化器可尽早剪枝
  • 若联结字段有 NULL,这些行一定不会被包含(NULL = NULLFALSE

LEFT JOIN 保留左表全部行,右表无匹配则补 NULL

LEFT JOIN 的关键在于“左表驱动”:无论右表有没有匹配,左表每一行都至少出现一次。没匹配上的右表字段全为 NULL

典型场景是查“所有用户及其最新订单”,即使部分用户没订单也要列出来。但要注意:如果在 WHERE 子句里对右表字段加非空限制(如 WHERE o.status = 'paid'),就可能把本该保留的左表空匹配行给筛掉——这实际退化成了 INNER JOIN

  • 正确写法:把右表的过滤条件放到 ON 子句里,例如 ON u.id = o.user_id AND o.status = 'paid'
  • 错误写法:LEFT JOIN ... ON u.id = o.user_id WHERE o.status = 'paid' → 丢失无订单用户
  • 索引建议:左表联结字段最好有索引;右表若常用于 ON 后的附加条件,相关字段也应考虑联合索引

RIGHT JOIN 很少用,逻辑上可统一转成 LEFT JOIN

RIGHT JOIN 是以右表为基准保留全部行,左表无匹配则补 NULL。但它和 LEFT JOIN 本质对称,只是左右调换。几乎所有情况都能通过交换表顺序 + 改用 LEFT JOIN 实现,可读性和维护性更好。

知了zKnown
知了zKnown

知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手。

下载

MySQL 手册明确建议避免使用 RIGHT JOIN,尤其在多表连接中容易绕晕自己。团队代码规范里基本禁止它。

  • 等价转换:A RIGHT JOIN B ON A.x = B.yB LEFT JOIN A ON A.x = B.y
  • 执行计划几乎一致,无性能差异
  • 嵌套多个 RIGHT JOIN 时,阅读顺序与执行顺序反直觉,极易出错

FULL OUTER JOIN 在 MySQL 中不存在,需用 UNION 模拟

MySQL 原生不支持 FULL OUTER JOIN。它的语义是“左右表所有行都保留,各自无匹配的部分用 NULL 填充”。要实现类似效果,必须组合 LEFT JOIN + RIGHT JOIN + UNION

SELECT u.id, u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION ALL
SELECT u.id, u.name, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id
WHERE u.id IS NULL;

注意这不是严格等价:上面写法会重复出现双方都有匹配的行(即 INNER JOIN 部分)。真正严谨的做法要用 UNION(去重)并拆成三部分:LEFT JOIN(含右表 NULL)、RIGHT JOIN(含左表 NULL)、再排除交集。但实际业务中极少需要这么复杂,多数时候用两个 LEFT JOIN 分别查再合并更清晰。

真正容易被忽略的是 NULL 处理:所有 JOIN 类型中,只要字段来自未匹配侧,值就是 NULL,不是空字符串或 0。做聚合或判断前必须显式用 IS NULLCOALESCE() 处理,否则结果可能不符合预期。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

668

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

516

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

256

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

533

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

602

2023.08.14

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

18

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号