【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 标准,可移植性好
优点 --- 容易看出连接了哪些表
优点 --- 不易漏写连接条件
缺点 连接条件和筛选条件混在一起 代码量稍多
缺点 多表时容易混乱 ---
缺点 容易漏写连接条件(产生笛卡尔积) ---
缺点 无法混合外连接 ---
相关推荐
IvorySQL18 分钟前
PostgreSQL 日报 |SUM-AVG 溢出检测不足(9 月 5 日)
数据库·postgresql·区块链
2601_9620990819 分钟前
python flask sqlalchemy连接数据库流程介绍
数据库·python·flask·教程·sqlalchemy
TDengine (老段)19 分钟前
TDgpt 概览 — AI 增强的时序数据库
大数据·数据库·人工智能·物联网·时序数据库·iot·tdengine
云贝贝贝20 分钟前
MySQL 运维高频 6 坑:字符集、超时、SQL_MODE、隐式转换、Online DDL、主从延迟
运维·sql·mysql
2501_9336707927 分钟前
采购运营校招Excel能力清单:函数、透视表、ERP数据与SQL入门
数据库·sql·excel
YOLO数据集集合1 小时前
红外热成像人员检测数据集 |红外检测 白热模式 人员检测 夜间监控 目标检测 YOLO格式 深度学习数据集 计算机视觉9067期
数据库·深度学习·yolo·目标检测·计算机视觉·红外人员·红外数据
BUG指挥官1 小时前
Redis已接入AI
数据库·人工智能·spring boot·redis·spring cloud
SkyWalking中文站9 小时前
BanyanDB 0.11.0:新特性与升级指南
数据库
₍˄·͈༝·͈˄*₎◞ ̑̑码11 小时前
MyBatis操作数据库
数据库·mybatis
刃神太酷啦13 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap