[MySQL初阶]MySQL(7) 表的内外连接

news2025/6/6 18:14:49

标题:[MySQL初阶]MySQL(7)表的内外连接
@水墨不写bug


在这里插入图片描述


文章目录

  • 一. 内连接 (INNER JOIN)
  • 二. 外连接 (OUTER JOIN)
    • 关键区别总结
  • 三、 如何选择


在 MySQL 中,连接(JOIN)用于根据两个或多个表之间的相关列组合行。内连接(INNER JOIN)和外连接(OUTER JOIN)的核心区别在于它们如何处理连接条件不匹配的行。

一. 内连接 (INNER JOIN)

  • 作用: 返回两个表中连接条件都匹配的行。
  • 结果集: 仅包含满足连接条件的行。如果一个表中的行在另一个表中没有匹配项,则该行不会出现在结果中。
  • NULL 值: 结果集中不会出现 NULL 值(因为只返回匹配成功的行)。
  • 语法:
SELECT ...
FROM table1
[INNER] JOIN table2 ON table1.column = table2.column;
-- `INNER` 关键字通常可以省略

内连接相当于之前写的两表做笛卡尔积后再通过where子句选择,意味着下面的这两句SQL是等价的:

#用之前的写法
select * from emp,dept where emp.deptno=dept.deptno and ename='lisi';
#用标准的内连接写法
select * from emp inner join dept on emp.deptno=dept.deptno and ename='lisi';

图示:

二. 外连接 (OUTER JOIN)

外连接强制保留一个或两个表的所有行,即使它们在另一个表中没有匹配项。根据保留哪个表的数据,外连接分为三种:

  • a. 左外连接 (LEFT [OUTER] JOIN)
    • 作用: 返回左表的所有行,以及右表中满足连接条件的匹配行。如果右表没有匹配行,则右表列用 NULL 填充。
    • 结果集: 左表所有行 + 匹配的右表行(无匹配则右表部分为 NULL)。
    • NULL 值: 当右表没有匹配行时,结果集中右表对应的列会显示为 NULL。
    • 语法:
SELECT ...
FROM table1
LEFT [OUTER] JOIN table2 ON table1.column = table2.column;

图示:

Table A (左)     Table B (右)
+----+----+     +----+----+
| id | val|     | id | val|
+----+----+     +----+----+
| 1  | A  |     | 2  | X  |
| 2  | B  |     | 3  | Y  |
| 3  | C  |     | 4  | Z  |
+----+----+     +----+----+

LEFT JOIN ON A.id = B.id:
+----+----+------+------+
| id | val| id   | val  |
+----+----+------+------+
| 1  | A  | NULL | NULL | <-- A 表行 1 保留,B 无匹配
| 2  | B  | 2    | X    |
| 3  | C  | 3    | Y    |
+----+----+------+------+

左外连接含义:返回左表(A)所有的记录,即使右表(B)中没有匹配的记录,B 表无匹配时结果为 NULL。
保留了左表 A 的所有行(id 1, 2, 3)。id 1 在 B 中无匹配,B 的列显示为 NULL。

  • b. 右外连接 (RIGHT [OUTER] JOIN)
    • 作用: 返回右表的所有行,以及左表中满足连接条件的匹配行。如果左表没有匹配行,则左表列用 NULL 填充。
    • 结果集: 右表所有行 + 匹配的左表行(无匹配则左表部分为 NULL)。
    • NULL 值: 当左表没有匹配行时,结果集中左表对应的列会显示为 NULL。
    • 语法:
SELECT ...
FROM table1
RIGHT [OUTER] JOIN table2 ON table1.column = table2.column;

图示:

Table A (左)     Table B (右)
+----+----+     +----+----+
| id | val|     | id | val|
+----+----+     +----+----+
| 1  | A  |     | 2  | X  |
| 2  | B  |     | 3  | Y  |
| 3  | C  |     | 4  | Z  |
+----+----+     +----+----+

RIGHT JOIN ON A.id = B.id:
+------+------+----+----+
| id   | val  | id | val|
+------+------+----+----+
| 2    | B    | 2  | X  |
| 3    | C    | 3  | Y  |
| NULL | NULL | 4  | Z  | <-- B 表行 4 保留,A 无匹配
+------+------+----+----+

右外连接含义:返回右表(B)所有的记录,即使左表(A)中没有匹配的记录,A 表无匹配时结果为 NULL。
保留了右表 B 的所有行(id 2, 3, 4)。id 4 在 A 中无匹配,A 的列显示为 NULL。

  • c. 全外连接 (FULL [OUTER] JOIN)
    • 作用: 返回左表和右表的所有行。只要其中一个表有匹配的行,就返回该行。 当某行在另一个表中没有匹配项时,另一个表的列用 NULL 填充。
    • 结果集: 左表所有行 + 右表所有行(无匹配的部分用 NULL 填充)。
    • NULL 值: 当左表或右表没有匹配行时,结果集中对应另一方的列会显示为 NULL。
    • 语法: MySQL 不直接支持 FULL OUTER JOIN。通常通过组合 LEFT JOINRIGHT JOIN 并使用 UNION(或 UNION ALL)来模拟实现:
SELECT ...
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNI0N [ALL] -- 使用 UNI0N ALL 会保留重复行(通常不应该有),UNI0N 会去重
SELECT ...
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column
WHERE table1.column IS NULL; -- 这个 WHERE 条件是为了只取 RIGHT JOIN 中左表为 NULL 的部分,避免重复

图示:

Table A         Table B
+----+----+     +----+----+
| id | val|     | id | val|
+----+----+     +----+----+
| 1  | A  |     | 2  | X  |
| 2  | B  |     | 3  | Y  |
| 3  | C  |     | 4  | Z  |
+----+----+     +----+----+

FULL OUTER JOIN ON A.id = B.id:
+------+------+------+------+
| id   | val  | id   | val  |
+------+------+------+------+
| 1    | A    | NULL | NULL | <-- 仅存在于 A
| 2    | B    | 2    | X    |
| 3    | C    | 3    | Y    |
| NULL | NULL | 4    | Z    | <-- 仅存在于 B
+------+------+------+------+

全外连接含义:返回左右两表所有的记录,任何一方无匹配时用 NULL 填充。MySQL 需用 UNION 实现。

关键区别总结

特性内连接 (INNER JOIN)左外连接 (LEFT JOIN)右外连接 (RIGHT JOIN)全外连接 (FULL JOIN)
匹配行返回返回返回返回
左表不匹配行不返回返回 (NULL填充)不返回返回 (NULL填充)
右表不匹配行不返回不返回返回 (NULL填充)返回 (NULL填充)
结果来源仅交集左表全集 + 匹配的右表右表全集 + 匹配的左表左表全集 + 右表全集
NULL 值不产生在右表列产生在左表列产生在左表或右表列产生

三、 如何选择

  • 需要两边都匹配的数据时:INNER JOIN(最常见)。
  • 需要主表所有记录 + 关联表匹配信息(即使关联表没有匹配项)时:
    • 主表在 FROM 后 / 第一个 JOIN 前 -> 用 LEFT JOIN
    • 主表在 JOIN 关键字后 -> 用 RIGHT JOIN(相对较少用,通常通过调整表顺序改用 LEFT JOIN)。
  • 需要两个表所有记录时:FULL OUTER JOIN(MySQL 需模拟实现)。

示例场景:

  • INNER JOIN: 查询所有下过订单的客户及其订单信息。
  • LEFT JOIN: 查询所有客户及其订单信息(包括从未下过订单的客户)。
  • RIGHT JOIN: 查询所有订单及其对应的客户信息(包括异常订单,其客户ID可能无效或被删除)。通常用 LEFT JOIN 并调换表顺序实现。
  • FULL JOIN: 查询所有客户和所有订单(列出所有客户,无论是否有订单;列出所有订单,无论客户信息是否有效)。

完~
未经作者同意禁止转载
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2399136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【R语言编程绘图-mlbench】

mlbench库简介 mlbench是一个用于机器学习的R语言扩展包&#xff0c;主要用于提供经典的基准数据集和工具&#xff0c;常用于算法测试、教学演示或研究场景。该库包含多个知名数据集&#xff0c;涵盖分类、回归、聚类等任务。 包含的主要数据集 BostonHousing 波士顿房价数据…

检索器组件深入学习与使用技巧 BaseRetriever 检索器基类

1. BaseRetriever 检索器基类 在 LangChain 中&#xff0c;传递一段 query 并返回与这段文本相关联文档的组件被称为 检索器&#xff0c;并且 LangChain 为所有检索器设计了一个基类——BaseRetriever&#xff0c;该类继承了 RunnableSerializable&#xff0c;所以该类是一个 …

【Doris基础】Doris中的Replica详解:Replica原理、架构

目录 1 Replica基础概念 1.1 什么是Replica 1.2 Doris中的副本类型 2 Doris副本架构设计 2.1 副本分布机制 2.2 副本一致性模型 3 副本生命周期管理 3.1 副本创建流程 3.2 副本恢复机制 4 副本读写流程详解 4.1 写入流程与副本同步 4.2 查询流程与副本选择 5 副本…

【中国·广州】第三届信号处理与智能计算国际学术会议 (SPIC2025) 即将开启

第三届信号处理与智能计算国际学术会议 (SPIC2025) 即将开启 在信息技术飞速发展的当下&#xff0c;信号处理与智能计算作为前沿科技领域&#xff0c;正深刻改变着我们的生活与产业格局。为汇聚全球顶尖智慧&#xff0c;推动该领域进一步突破&#xff0c;第三届信号处理与智能…

Android12 Launcher3显示所有应用列表

Android12 Launcher3显示所有应用列表 1.前言&#xff1a; 最近在Android12Rom定制时需要显示所有桌面应用的图标&#xff0c;并且不能去掉抽屉&#xff0c;在手机上面抽屉和所有应该列表是两种不同模式&#xff0c;用户基可以自行选择&#xff0c;但是在自定义的launcher中这…

智能快递地址解析接口如何用PHP调用?

一、什么是智能快递地址解析接口 随着互联网技术的普及和电子商务的迅猛发展&#xff0c;网购已成为现代人日常生活的重要组成部分。然而&#xff0c;在这个便捷的背后&#xff0c;一个看似不起眼却影响深远的问题正悄然浮现——用户填写的快递地址格式混乱、信息不全甚至错漏…

华为OD机试真题——模拟消息队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…

基于VU37P的高性能采集板卡

基于VU37P的高性能采集板卡是一款最大可提供20路ADC接收通道的高性能采集板卡。每路A/D通道支持1GS/s的采样率&#xff0c;分辨率为14bit&#xff0c;模拟输入带宽可达500MHz&#xff0c;交流耦合&#xff0c;输入阻抗50欧姆。 产品简介 可提供20路ADC接收通道的高性能采集板…

2025-05-31 Python深度学习10——模型训练流程

文章目录 1 数据准备1.1 下载与预处理1.2 数据加载 2 模型构建2.1 自定义 CNN 模型2.2 GPU加速 3 训练配置3.1 损失函数3.2 优化器3.3 训练参数 4 训练循环4.1 训练模式 (model.train())4.2 评估模式 (model.eval()) 5 模型验证 本文环境&#xff1a; Pycharm 2025.1Python 3.1…

K8S StatefulSet 快速开始

其实这篇文章的梗概已经写了很久了&#xff0c;中间我小孩出生了&#xff0c;从此人间多了一份牵挂。抽出一些时间去办理新生儿相关手续。初为人父确实艰辛&#xff0c;就像学技术一样&#xff0c;都需要有极大的耐心&#xff0c;付出很多的时间。 一、引子 1.1、独立的存储 …

nav2笔记-250603

合作背景&#xff1a; AMD与Open Navigation在过去几个月里进行了合作&#xff0c;旨在向ROS 2社区展示AMD强大的Ryzen AI、Embedded和Kria能力。 演示内容&#xff1a; 帖子提到&#xff0c;他们已经开始展示如何使用Ryzen AI为自主机器人产品提供动力&#xff0c;在各种现实世…

指纹识别+精准化POC攻击

开发目的 解决漏洞扫描器的痛点 第一就是扫描量太大&#xff0c;对一个站点扫描了大量的无用 POC&#xff0c;浪费时间 指纹识别后还需要根据对应的指纹去进行 payload 扫描&#xff0c;非常的麻烦 开发思路 我们的思路分为大体分为指纹POC扫描 所以思路大概从这几个方面…

mac环境下的python、pycharm和pip安装使用

Python安装 Mac环境下的python安装 下载地址&#xff1a;https://www.jetbrains.com.cn/pycharm/ 一直点击下一步即可完成 在应用程序中会多了两个图标 IDLE 和 Python launcher IDLE支持在窗口中直接敲python命令并立即执行&#xff0c;双击即可打开 Python launcher双击打…

BUUCTF[极客大挑战 2019]Havefun 1题解

BUUCTF[极客大挑战 2019]Havefun 1题解 题目分析解题理解代码逻辑&#xff1a;构造Payload&#xff1a; 总结 题目分析 生成靶机&#xff0c;进入网址&#xff1a; 首页几乎没有任何信息&#xff0c;公式化F12打开源码&#xff0c;发现一段被注释的源码&#xff1a; 下面我们…

Tomcat优化篇

目录 一、Tomcat自身配置 1.Tomcat管理页面 2. 禁用AJP服务 3.Executor优化 4.三种运行模式 5.web.xml 6.Host标签 7.Context标签 8.启动速度优化 9.其他方面 二、JMeter测试 笔者推荐 一、Tomcat自身配置 1.Tomcat管理页面 我们可以打开Tomcat的管理页面&#xff…

Temporal Fusion Transformer(TFT)扩散模型时间序列预测模型

1. TFT 简介 Temporal Fusion Transformer&#xff08;TFT&#xff09;模型是一种专为时间序列预测设计的高级深度学习模型。它结合了神经网络的多种机制处理时间序列数据中的复杂关系。TFT 由 Lim et al. 于 2019年提出&#xff0c;旨在处理时间序列中的不确定性和多尺度的依…

【LangServe部署流程】5 分钟部署你的 AI 服务

目录 一、LangServe简介 二、环境准备 1. 安装必要依赖 2. 编写一个 LangChain 可运行链&#xff08;Runnable&#xff09; 3. 启动 LangServe 服务 4. 启动服务 5. 使用 API 进行调用 三、可选&#xff1a;访问交互式 Swagger 文档 四、基于 LangServe 的 RAG 应用部…

攻防世界-unseping

进入环境 在获得的场景中发现PHP代码并进行分析 编写PHP编码 得到 Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozOiJwd2QiO319 将其传入 想执行ls&#xff0c;但是发现被过滤掉了 使用环境变量进行绕过 $a new…

[yolov11改进系列]基于yolov11使用FasterNet替换backbone用于轻量化网络的python源码+训练源码

【FasterNet介绍】 为了设计快速神经网络&#xff0c;许多工作都集中在减少浮点运算的数量&#xff08;FLOPs&#xff09;上。 然而&#xff0c;我们观察到FLOPs的减少并不一定会导致延迟的类似程度的减少。 这主要源于低效率的每秒浮点运算(FLOPS)。 为了实现更快的网络&#…

一周学会Pandas2之Python数据处理与分析-Pandas2数据绘图与可视化

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 集成了 Matplotlib&#xff0c;提供了简单高效的绘图接口&#xff0c;使数据可视化变得直观便捷。本指南将详…