艾莉丝努力练剑头像
关注
【MYSQL】MYSQL学习的一大重点:表的内外连接封面图

【MYSQL】MYSQL学习的一大重点:表的内外连接


头像


🎬 个人主页艾莉丝努力练剑

专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平

🎬 艾莉丝的简介:

在这里插入图片描述



在这里插入图片描述


0 ~> 表连接的基础本质

0.1 笛卡尔积(CROSS JOIN)

两张表的所有行进行全量排列组合,若表 A 有 m 行、表 B 有 n 行,则结果集为 m×n 行。笛卡尔积是所有表连接的底层基础,其他连接类型本质都是在笛卡尔积基础上做不同规则的筛选。

0.2 连接的分类体系

按照结果集的保留规则,分为四大类:

  • 内连接:仅保留两表满足连接条件的匹配行
  • 外连接:保留某一侧表的全部行,另一侧匹配填充、不匹配补 NULL
    • 左外连接
    • 右外连接
    • 全外连接(MySQL 原生不支持,需间接实现)

1 ~> 内连接(INNER JOIN)

1.1 核心概念

内连接基于指定连接条件对两表笛卡尔积进行筛选,仅保留两张表中同时满足匹配条件的行,是业务开发中使用频率最高的连接查询方式。 底层等价于:笛卡尔积 + WHERE 连接条件过滤。

1.2 语法格式

存在两种语义完全等价的写法:

  1. 隐式内连接:逗号分隔表,连接条件写在 WHERE 子句
  2. 显式内连接:使用INNER JOIN ... ON ...语法,INNER关键字可省略
-- 1. 隐式内连接(传统写法)
SELECT 字段列表 
FROM1,2 
WHERE 连接条件 AND 其他业务过滤条件;

-- 2. 显式内连接(标准SQL写法,推荐)
SELECT 字段列表
FROM1 [INNER] JOIN2 
ON 连接条件
WHERE 其他业务过滤条件;

1.3 经典案例:查询 SMITH 的姓名与所属部门名称

基于 scott 示例库的emp员工表、dept部门表演示:

-- 隐式内连接写法
SELECT ename, dname 
FROM EMP, DEPT 
WHERE EMP.deptno = DEPT.deptno 
  AND ename = 'SMITH';

-- 显式内连接标准写法(语义分层更清晰)
SELECT ename, dname 
FROM EMP INNER JOIN DEPT 
ON EMP.deptno = DEPT.deptno 
WHERE ename = 'SMITH';

-- 条件全写在ON后的写法(内连接下结果等价,不推荐)
SELECT ename, dname 
FROM EMP INNER JOIN DEPT 
ON EMP.deptno = DEPT.deptno 
   AND ename = 'SMITH';

1.4 编写规范说明

内连接场景下,过滤条件写在ONWHERE中执行结果一致。但从代码可维护性角度,连接关联条件统一写 ON、业务过滤条件统一写 WHERE,逻辑分层更清晰。


2 ~> 外连接(OUTER JOIN)

2.1 左外连接(LEFT JOIN / LEFT OUTER JOIN)

2.1.1 核心概念

LEFT JOIN左侧的表作为主表,左表的所有行都会被完整保留;右侧表根据连接条件进行匹配:

  • 匹配成功:填充右表对应字段数据
  • 匹配失败:右表对应字段全部填充为 NULL 适用场景:需要保留主表全量数据,同时关联从表补充信息的场景,例如「查询所有学生的成绩,缺考学生也要展示」。

2.1.2 语法格式

SELECT 字段列表
FROM 左表 LEFT [OUTER] JOIN 右表
ON 连接条件
WHERE 后续结果过滤条件;

其中OUTER关键字可省略。

2.1.3 案例演示

基于学生表stu与成绩表exam演示:

-- 数据准备
CREATE TABLE stu (id INT, name VARCHAR(30));  -- 学生表
CREATE TABLE exam (id INT, grade INT);        -- 成绩表

INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);

-- 左外连接:查询所有学生的成绩,无成绩的学生信息也保留
SELECT * 
FROM stu LEFT JOIN exam 
ON stu.id = exam.id;

执行结果:stu表 4 条数据全部保留,id 为 3、4 的学生无对应成绩,成绩字段显示为 NULL。

2.2 右外连接(RIGHT JOIN / RIGHT OUTER JOIN)

2.2.1 核心概念

RIGHT JOIN右侧的表作为主表,右表的所有行都会被完整保留;左侧表根据连接条件进行匹配:

  • 匹配成功:填充左表对应字段数据
  • 匹配失败:左表对应字段全部填充为 NULL

2.2.2 语法格式

SELECT 字段列表
FROM 左表 RIGHT [OUTER] JOIN 右表
ON 连接条件
WHERE 后续结果过滤条件;

2.2.3 案例演示

-- 右外连接:查询所有成绩对应的学生信息,无对应学生的成绩也保留
SELECT * 
FROM stu RIGHT JOIN exam 
ON stu.id = exam.id;

执行结果:exam表 3 条数据全部保留,id 为 11 的成绩无对应学生,学生字段显示为 NULL。

2.3 左右外连接的等价转换

右外连接可以通过调换两表的书写顺序,完全等价改写为左外连接,二者执行逻辑与结果完全一致。

-- 原右外连接语句
SELECT * FROM stu RIGHT JOIN exam ON stu.id = exam.id;

-- 等价改写为左外连接
SELECT * FROM exam LEFT JOIN stu ON stu.id = exam.id;

2.4 高频考点:ON 与 WHERE 的本质区别(外连接场景)

外连接中ONWHERE的执行时机与语义完全不同,是面试高频易错点:

  1. ON 子句:在两表连接生成中间结果的阶段生效,是连接的匹配规则。即使条件不满足,主表的行也会被保留,仅从表字段补 NULL。
  2. WHERE 子句:在连接生成最终结果集后生效,对所有行进行统一过滤。若 WHERE 条件包含从表字段的非空判断,会剔除 NULL 行,导致外连接退化为内连接效果。
-- 语句1:过滤条件写在ON中
SELECT * FROM stu LEFT JOIN exam 
ON stu.id = exam.id AND exam.grade > 60;
-- 结果:左表4行全部保留,仅匹配分数>60的成绩,不满足的成绩字段为NULL

-- 语句2:过滤条件写在WHERE中
SELECT * FROM stu LEFT JOIN exam 
ON stu.id = exam.id 
WHERE exam.grade > 60;
-- 结果:仅保留2行匹配数据,等同于内连接,无成绩/成绩不及格的行被全部过滤

2.5 拓展:全外连接实现

MySQL 原生不支持 SQL 标准的FULL OUTER JOIN,可通过「左外连接 + UNION + 右外连接」间接实现,保留两张表的全部行。

SELECT * FROM stu LEFT JOIN exam ON stu.id = exam.id
UNION
SELECT * FROM stu RIGHT JOIN exam ON stu.id = exam.id;

3 ~> 实战场景与经典题型

3.1 业务场景:全量部门员工关联查询

需求:列出所有部门名称及对应员工信息,同时展示没有员工的空部门。 核心思路:以部门表为主表,左外连接员工表。

-- 写法1:部门表左外连接员工表(推荐,语义直观)
SELECT d.dname, e.* 
FROM dept d LEFT JOIN emp e 
ON d.deptno = e.deptno
ORDER BY d.deptno ASC;

-- 写法2:员工表右外连接部门表(语义等价)
SELECT d.dname, e.* 
FROM emp e RIGHT JOIN dept d 
ON d.deptno = e.deptno
ORDER BY d.deptno ASC;

3.2 经典 OJ 题目

  1. LeetCode 178. 分数排名(Rank Scores) 核心考点:自连接、窗口排序函数、分组统计
  2. LeetCode 626. 换座位(Exchange Seats) 核心考点:自连接、条件判断、行号关联

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

艾莉丝努力练剑

C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主


👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。
❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。
【收藏】 把核心知识点存好,在需要时随时查、随时用。
💬 【评论】 分享你的经验或疑问,评论区一起交流避坑!

不要忘记给博主“一键四连”哦!

“今日练剑达成!”
文章配图

“技术之路难免有困惑,但同行的人会让前进更有方向。”

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾

【MYSQL】MYSQL学习的一大重点:复合查询

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

在这里插入图片描述

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_89899187/article/details/163200338

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--