【MYSQL】表的内外连接--详解(重点)

表的连接分为内连和外连

内连接:

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询

语法格式

隐式内连接

sql 复制代码
SELECT 列名
FROM 表1, 表2
WHERE 表1.连接列 = 表2.连接列          -- 连接条件
  AND 其他筛选条件;

显式内连接(标准写法)

sql 复制代码
SELECT 列名
FROM 表1
[INNER] JOIN 表2 ON 表1.连接列 = 表2.连接列   -- 连接条件
WHERE 其他筛选条件;
  • INNER 关键字可以省略,直接写 JOIN 即可

本质:内连接就是在笛卡尔积的基础上,加上筛选条件,去掉无意义的组合。

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

显示SMITH的名字和部门名称

  • 用前面的写法
  • 用标准的内连接写法

外连接:

外连接分为左外连接和右外连接

左外连接(LEFT OUTER JOIN)

左外连接 :以左表为基础,返回左表的所有记录 ,右表只返回匹配的记录;如果右表没有匹配,则右表字段填充为 NULL

如果联合查询,左侧的表完全显示我们就说是左外连接。

sql 复制代码
SELECT 列名
FROM 左表
LEFT [OUTER] JOIN 右表
ON 连接条件;
  • OUTER 关键字可以省略,直接写 LEFT JOIN 即可。

建两张表

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

  • 当左边表和右边表没有匹配时,也会显示左边表的数据

什么时候用左外连接?

场景 说明
需要显示左表的所有记录 比如显示所有学生,不管有没有成绩
找出左表中在右表没有匹配的记录 加上 WHERE 右表.列 IS NULL
主表(左表)数据必须完整显示 订单表为主,关联用户信息

右外连接(RIGHT OUTER JOIN)

右外连接 = 右表的每一行都保留 + 左表只加匹配的行(不匹配就填 NULL)

如果联合查询,右侧的表完全显示我们就说是右外连接。
等价于:A RIGHT JOIN B = B LEFT JOIN A

实际开发中很少直接用右外连接,通常改写成左外连接更清晰。

标准语法

sql 复制代码
SELECT 列名
FROM 左表
RIGHT [OUTER] JOIN 右表
ON 连接条件;

OUTER 关键字可以省略,直接写 RIGHT JOIN 即可

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

列出部门名称和这些部门的员工信息,同时列出没有员工的部门

方法一:

方法二:

类比这个A RIGHT JOIN B = B LEFT JOIN 二者是等价的
结论:在实际开发中,右外连接几乎从来不需要主动使用,因为任何右外连接都可以改写成左外连接。

补充:

1.内连接和外连接对比

对比项 内连接(INNER JOIN) 左外连接(LEFT JOIN) 右外连接(RIGHT JOIN)
保留的数据 只保留两表都能匹配上的行 保留左表全部 保留右表全部
不匹配时 直接丢弃该行 右表列填 NULL 左表列填 NULL
结果行数 ≤ 左表行数 ≥ 左表行数 ≥ 右表行数
数据完整性 可能丢失主表数据 保证左表数据不丢失 保证右表数据不丢失
使用频率 最高(90%以上) 较高 极低
是否可被替代 不可替代 可替代右外连接 可被左外连接替代

优缺点对比表

连接类型 优点 缺点
内连接 结果精确,只返回有效数据 性能最好(数据量最小) 逻辑简单,易理解 不会出现意外的 NULL 会丢失主表中无匹配的数据 不适合需要保留全量数据的场景
左外连接 保证左表数据完整不丢失 可清晰看出哪些数据无匹配 适合主表+附属表的查询 可替代右外连接 结果中会出现 NULL(需处理) 数据量可能较大 性能略差于内连接 理解成本稍高
右外连接 保证右表数据完整不丢失 语法对称完整 可读性差(不直观) 可被左外连接完全替代 实际开发几乎不用 增加团队理解成本

2.显式内连接和隐式内连接 对比

对比项 隐式内连接(逗号语法) 显式内连接(JOIN语法)
语法 FROM t1, t2 WHERE t1.id = t2.id FROM t1 JOIN t2 ON t1.id = t2.id
关键字 逗号 , JOIN / INNER JOIN
连接条件位置 WHERE 子句中 ON 子句中
筛选条件位置 也在 WHERE 子句中 WHERE 子句中(与连接条件分离)
标准性 老式语法(SQL-89 标准) 标准语法(SQL-92 标准)
可读性 较差(条件混在一起) 较好(职责分离)
易错性 容易漏写连接条件(产生笛卡尔积) 连接条件强制写在 ON 中
混合连接支持 不支持(无法混合 LEFT JOIN) 支持(可混合 LEFT/RIGHT JOIN)
实际使用 逐渐被淘汰 主流推荐

优缺点对比

对比项 隐式内连接 显式内连接
优点 代码量稍少(少写 JOIN/ON) 连接和筛选分离,结构清晰
优点 老程序员习惯 符合 SQL 标准,可移植性好
优点 --- 容易看出连接了哪些表
优点 --- 不易漏写连接条件
缺点 连接条件和筛选条件混在一起 代码量稍多
缺点 多表时容易混乱 ---
缺点 容易漏写连接条件(产生笛卡尔积) ---
缺点 无法混合外连接 ---
相关推荐
147API2 小时前
Claude Opus 4.8 接口与工程落地分析:长任务调用链应该怎么设计
java·前端·数据库
绝知此事2 小时前
Redis 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
数据库·redis·缓存
鸽芷咕2 小时前
金仓数据库标量子查询消除:一条SQL从32秒优化到24毫秒
数据库·sql
朝阳5812 小时前
MySQL 主从复制 — 双服务器灾备方案(原生安装)
服务器·数据库·mysql
是狐狸吖2 小时前
Redis分布式锁进阶第十六篇
数据库·redis·分布式
闪电悠米2 小时前
黑马点评-优惠券秒杀-04_one_user_one_order
服务器·网络·数据库
YL200404262 小时前
【Redis实战篇】基于Redis的分布式锁的原理及实现
数据库·redis·缓存
兔子宇航员03012 小时前
HiveSQL 中 NULL 与空字符串的区别与注意事项
数据库·数据仓库·sql
杨云龙UP2 小时前
Oracle CDB巡检脚本使用SOP:从HTML原始报告到Word正式交付_2026-05-29
运维·服务器·数据库·oracle·架构·html·巡检