当前位置: 首页 > news >正文

MySQL 中的表连接(JOIN)详解

在 MySQL 中,表连接(JOIN)用于根据相关列在两个或多个表之间进行数据查询

常见的连接方式包括:

  1. INNER JOIN(内连接)
  2. LEFT JOIN(左连接)
  3. RIGHT JOIN(右连接)
  4. FULL JOIN(全连接,MySQL 不直接支持)
  5. CROSS JOIN(交叉连接)

1. INNER JOIN(内连接)

作用:返回两个表中 匹配 的记录,不匹配的记录不会出现在结果集中

示例

假设有两个表:

users 表(用户表)
idnamecountry_id
1张三1
2李四2
3王五3
countries 表(国家表)
idcountry_name
1中国
2美国
4英国
SELECT users.id, users.name, countries.country_name
FROM users
INNER JOIN countries ON users.country_id = countries.id;

结果

idnamecountry_name
1张三中国
2李四美国

解析

  • 只返回 users.country_id = countries.id 的匹配记录
  • 王五(country_id=3) 没有匹配项,因此被排除
  • 英国(id=4)users 表中没有引用,因此也被排除

2. LEFT JOIN(左连接)

作用:返回左表(users)的所有记录,如果右表(countries)中有匹配的,则一起返回;如果没有匹配,则右表的字段返回 NULL

示例

SELECT users.id, users.name, countries.country_name
FROM users
LEFT JOIN countries ON users.country_id = countries.id;

结果

idnamecountry_name
1张三中国
2李四美国
3王五NULL

解析

  • 张三李四 有匹配项,所以 country_name 正常显示
  • 王五 没有匹配的 country_id=3,但因 LEFT JOIN,它仍然会出现在结果集中,只是 country_nameNULL

3. RIGHT JOIN(右连接)

作用:返回右表(countries)的所有记录,如果左表(users)中有匹配的,则一起返回;如果没有匹配,则左表的字段返回 NULL

示例

SELECT users.id, users.name, countries.country_name
FROM users
RIGHT JOIN countries ON users.country_id = countries.id;

结果

idnamecountry_name
1张三中国
2李四美国
NULLNULL英国

解析

  • 张三李四 有匹配项,正常返回
  • 英国id=4)在 users 表中没有匹配项,但因 RIGHT JOIN,它仍然会出现在结果集中,只是 users 的字段返回 NULL

4. FULL JOIN(全连接,MySQL 不直接支持)

作用:返回 左右两张表的所有记录,匹配的合并,不匹配的部分会填充 NULL

MySQL 不支持 FULL JOIN,但可以使用 UNION 结合 LEFT JOINRIGHT JOIN 来实现:

SELECT users.id, users.name, countries.country_name
FROM users
LEFT JOIN countries ON users.country_id = countries.id
UNION
SELECT users.id, users.name, countries.country_name
FROM users
RIGHT JOIN countries ON users.country_id = countries.id;

结果

idnamecountry_name
1张三中国
2李四美国
3王五NULL
NULLNULL英国

5. CROSS JOIN(交叉连接)

作用:返回 笛卡尔积,即两张表的所有可能组合,不需要 ON 条件

示例

SELECT users.name, countries.country_name
FROM users
CROSS JOIN countries;

结果

namecountry_name
张三中国
张三美国
张三英国
李四中国
李四美国
李四英国
王五中国
王五美国
王五英国

解析

  • 3 个用户 × 3 个国家 = 9 条记录

JOIN 方式对比总结

连接方式作用是否包含不匹配数据
INNER JOIN仅返回匹配的记录
LEFT JOIN返回左表所有数据,右表无匹配时填充 NULL是(左表)
RIGHT JOIN返回右表所有数据,左表无匹配时填充 NULL是(右表)
FULL JOIN返回两表所有数据,填充 NULL是(左右表)
CROSS JOIN返回两表的笛卡尔积(所有组合)N/A

结论

  • INNER JOIN 是最常用的方式,只获取匹配的数据
  • LEFT JOIN 在查询“即使没有关联数据也要展示左表数据”时非常有用(如用户未选择国家的情况)
  • RIGHT JOIN 类似 LEFT JOIN,但更少用(一般交换表位置改用 LEFT JOIN
  • FULL JOIN 适用于“取并集”的场景,但 MySQL 需要 UNION 方式实现
  • CROSS JOIN 适用于所有组合的情况,但大数据量时慎用,容易导致性能问题
http://www.dtcms.com/a/98224.html

相关文章:

  • 六十天前端强化训练之第三十五天之Jest单元测试大师课:从入门到实战
  • 【C++20】format格式化输出
  • 每日一题 == 674. 最长连续递增序列
  • 26_ajax
  • qgis点从面图层上拾取属性
  • NLP高频面试题(二十四)——RAG相关内容简介
  • 【Java】public class Person{}和public Person{} 和 public Person person究竟都有哪些区别呢。
  • Java---类与对象
  • NLP高频面试题(二十三)对抗训练的发展脉络,原理,演化路径
  • 关于跨域与.NET的处理方案
  • 软考-高级-系统架构设计师【考试备考资料下载】
  • 自学-408-《计算机网络》(总结速览)
  • 区块链在教育领域的创新应用:改变传统教育的未来
  • 黑盒测试的等价类划分法(输入数据划分为有效的等价类和无效的等价类)
  • 综合实验
  • qt之使用redis与其他程序(python)交互同通信
  • 基于SpringBoot实现的高校实验室管理平台功能四
  • 多线程 -- Thread类
  • vue学习
  • Linux内核同步机制:解锁并发编程的奥秘
  • 软件的常用设计模式。可参考一个一个学习
  • 用Nginx实现负载均衡与高可用架构(整合Keepalived)
  • [Linux]在vim中批量注释与批量取消注释
  • 进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程
  • 跟着StatQuest学知识08-RNN与LSTM
  • Claude 在 SVG 绘图创作中的潜力与技巧
  • 【软考-架构】10.1、软件工程概述-CMM-软件过程模型-逆向工程
  • Pycharm (十)字符串扩展:统计小串在大串中出现的次数
  • C++23:现代C++的模块化革命与零成本抽象新高度
  • 笔记:遇见未来——6G协同创新技术研讨会