MySQL表的内连和外连

之前我们讲解MySQL的查询方法,今天我们来讲解一下内连接和外链接,话不多说,现在开始啦,对了,今天是五一的第一天,祝大家五一快乐!!

一、连接的本质

在关系型数据库中,数据往往分散在多个表中。为了在一次查询中获取完整的信息,就需要将这些表按照某种规则"连接"起来。连接的底层是笛卡尔积:即让表A的每一行和表B的每一行两两组合,形成一张巨大的临时表。然后,再通过连接条件从中筛选出真正有意义的行


二、内连接

内连接是最常用的连接方式,它只返回两个表中完全满足连接条件的行。不匹配的行会被直接丢弃。

  • 传统写法 :在FROM中列出多个表,用WHERE子句指定连接条件。其实我们之前写的等值连接多数就是内连接。

  • 标准写法 :使用INNER JOIN ... ON ...语法,语义更清晰。

特点:结果集中绝不会出现因不匹配而产生的空值

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

注:前面学习的都是内连接

例如查询员工及其部门名,只会显示有部门的员工;既没有部门的员工,也没有员工的部门,都不会出现

下面是一个样例

显示SMITH的名字和所在部门名称


三、外连接

外连接会保留某个表中的全部记录 ,即使它在另一张表中找不到匹配。缺失的字段用NULL填充。外连接分为左外连接和右外连接

为了更好的讲解知识点,下面是我们预先创建的database与tables;

1. 左外连接

使用LEFT JOIN,会完整显示左侧表 的所有行,右表中无匹配的列置为NULL

典型场景:你需要以左表为主体来查看信息。比如"列出所有学生,并显示他们的成绩"。即使某个学生从未参加过考试,他的个人信息也要保留,成绩部分留空。

例子:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

2. 右外连接

使用RIGHT JOIN,会完整显示右侧表 的所有行,左表无匹配的列置为NULL

典型场景:需要以右表为主体。比如"列出所有成绩,并显示对应的学生信息"。某个成绩如果找不到对应的学生(可能学生记录已被删除),成绩记录依然要呈现,学生信息为空。

例子:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来


四、如何选择左连接还是右连接

实际上,左连接和右连接在功能上可以互相转换,只需交换表的顺序。例如:

  • "列出所有部门和员工,包括没有员工的部门"

    可以写作:部门表 LEFT JOIN 员工表 (左表是部门,完整保留)。

    也可以写作:员工表 RIGHT JOIN 部门表(右表是部门,完整保留)。

开发建议 :通常固定使用LEFT JOIN会更好理解,把要全量保留的主表放在左边。


五、总结

  • 内连接 :结果集只包含匹配成功的行,两表地位平等,无主次之分。

  • 左外连接 :左表为主,左表所有行一定出现;右表有就显示,没有就为空。

  • 右外连接 :右表为主,右表所有行一定出现;左表有就显示,没有就为空。

如果把内连接想象成两个圆取交集,那么左外连接就像是保留左边整个圆,右边只取与左边相交的部分,未相交的右半部分留白

好啦,这就是关于MySQL的内外连接的知识点啦,下篇再见~~

相关推荐
IvorySQL几秒前
PostgreSQL 全球对话:开源链接世界,共建共治共享
数据库·postgresql·开源
2023自学中4 分钟前
Linux 内核与用户空间 内存管理详解(堆与栈篇)
linux·嵌入式·内存·开发板
淮南颂恩少儿编程C++6 分钟前
在淮南:编程信息学培训与 C++ 信奥赛:从 CSP 到 NOI 的进阶之路
人工智能·学习·青少年编程
似水এ᭄往昔10 分钟前
【Linux系统编程】--虚拟地址空间
linux·服务器
Nontee11 分钟前
新手数据库进阶:大白话图解四大隔离级别与底层机制
数据库·oracle
不会C语言的男孩12 分钟前
Linux 系统编程 · 第 3 章:文件 I/O 基础
linux·服务器
dishugj17 分钟前
【YashanDB 认证】我的崖山数据库初体验:从陌生到上手的成长之路
数据库
前端 贾公子20 分钟前
Claude Code 的 skills 源码解析 (上)
数据库·人工智能
吠品23 分钟前
.NET 8 单文件发布:把 exe 和一堆 dll 打进一个文件里
服务器·数据库·windows
cmes_love34 分钟前
期货五档tick数据下载教程期权五档高频历史数据以及分钟量化回测下载
数据库