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

article/2025/6/26 5:18:23

标题:[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.hkcw.cn/article/KhRwwDZfjG.shtml

相关文章

Python自带的窗体开发技术:Tkinter 从入门到精通

文章目录 第一部分&#xff1a;Tkinter 基础1. 第一个 Tkinter 程序2. 基本组件介绍3. 布局管理pack() - 简单布局grid() - 网格布局place() - 精确位置布局 第二部分&#xff1a;Tkinter 进阶1. 事件处理2. 对话框3. 菜单和工具栏 第三部分&#xff1a;Tkinter 高级应用1. 使用…

第十七章 数据集成

系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具的安装与使用 …

榴莲能从奢侈果变成亲民果吗 供应增加价格下降

夏季是各类水果集中上市的季节,榴莲爱好者们最近有口福了,市场上榴莲价格大幅下降,甚至出现“腰斩”的情况。这背后的原因是什么?榴莲是否会从“奢侈果”变成“亲民果”?走进浙江湖州的一家榴莲批发店,可以看到榴莲成堆地摆放在货架上,老板肖女士正在通过直播销售榴莲。…

育碧“夭折”的沙盒游戏概念图曝光:类似《我的世界》风格 创意总监离职

育碧在经历长期财务困境导致的大规模重组背景下,陆续叫停了多个项目,包括《全境封锁:郊野行动》《XDefiant》以及“Project Q”。当地时间1日,外媒MP1ST披露了育碧另一个尚未官宣但已夭折的计划——“Project Renaissance”。早在2023年,Kotaku曾报道该项目的存在。据报道…

菲律宾拉欧盟搞“安全与防务对话” 深化防务合作应对挑战

在南海紧张局势不断升级之际,菲律宾外长马纳罗与欧盟外交与安全政策高级代表卡拉斯在马尼拉召开联合记者会,宣布双方同意建立安全与防务对话机制。该机制旨在应对网络攻击、外来干预和信息操纵等跨境新兴安全威胁和挑战。安全与防务对话将以现有机制为基础,重点关注海域意识…

谈判现场曝光 俄团长冷眼审视乌代表表情严肃!

谈判现场曝光 俄团长冷眼审视乌代表。当地时间6月2日,俄罗斯代表团与乌克兰代表团,抵达土耳其伊斯坦布尔举行第二轮俄乌谈判。随后俄曝光了俄乌谈判现场!谈判现场曝光 俄团长冷眼审视乌代表谈判现场曝光 俄团长冷眼审视乌代表谈判现场曝光 俄团长冷眼审视乌代表谈判现场曝光…

ubuntu24.04 查看时区并设置Asia/Shanghai时区

一、查看当前系统设置的时区 timedatectl 二、修改为Asia/Shanghai sudo timedatectl set-timezone Asia/Shanghai sudo nano /etc/timezone #修改内容为&#xff1a;Asia/Shanghai sudo dpkg-reconfigure --frontend noninteractive tzdata

贾冰瘦了 网友:压力给到沈腾 减肥热潮席卷娱乐圈

5月31日,演员贾冰的妻子发布了一段视频,祝福大家端午节快乐,并配文“从此我家多了个瘦子”。在两人合影中,贾冰明显瘦了很多。评论区里,网友们纷纷询问他如何瘦这么多,甚至有人表示他瘦得都脱相了。贾冰妻子回复说,主要是通过少吃(一天一顿的那种)和运动来达到减肥效果…

5月100个城市新房均价上涨 政策利好支撑需求释放

5月100个城市新房均价上涨 政策利好支撑需求释放!6月1日,中指研究院发布《中国房地产指数系统百城价格指数报告》。报告显示,5月全国100个城市新建住宅平均价格环比上涨0.30%,同比上涨2.56%。从涨跌城市来看,33个城市环比上涨,54个城市环比下跌,13个城市持平。二手房价格…

没有假球 全是世仇 苏超火出圈:比赛第一,友谊第十四

“友谊第一,比赛第二。” “等等!重来!” “友谊第一,比赛第十四!” “不对!再来!” “比赛第一,友谊第十四。”近日,被称为“苏超”的江苏省首届城市足球联赛爆火出圈。盐城现场观众达到22613人,网友感叹上座率堪比世界杯。据闪电新闻报道,“苏超”观众数量甚至超过…

这种凉鞋易致孩子性早熟还有毒 邻苯超标严重

这种凉鞋易致孩子性早熟还有毒!目前正值儿童凉鞋购买高峰期,各种款式的儿童凉拖鞋如水晶鞋、洞洞鞋、果冻鞋等因其外观漂亮可爱且穿着方便而受到小朋友和家长们的喜爱。然而,在孩子们穿着这些漂亮的凉鞋奔跑嬉戏时,潜在的安全隐患也悄然存在。由于材质差异,如果不仔细甄别…

中小学生攀比起"体考神器"碳板鞋 校园内的新潮流

最近,碳板鞋在校园里变得非常流行。这类鞋子外观炫酷、科技感十足,受到很多学生的喜爱。一些家长认为这类专业跑步鞋能帮助孩子提高体育成绩,因此不惜重金购买高端碳板鞋。然而,这种现象也引发了一些问题。碳板跑鞋是一种在中底嵌入碳纤维板的跑步鞋,设计初衷是为了提高精…

金价大涨!金饰价格重回1000元/克 国际金价反弹带动

美东时间5月29日,国际金价出现反弹。现货黄金价格上涨0.96%,达到3317.8美元/盎司;COMEX黄金期货上涨0.61%,报3342.6美元/盎司;COMEX白银期货则上涨0.84%,报33.44美元/盎司。次日早间,金价再度下跌。现货黄金价格微跌0.02%,报3316.6美元/盎司;COMEX黄金期货下跌0.17%,…

一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——4. 配置服务器终端环境 zsh , oh my zsh, vim

前言 通过前面几篇文章&#xff0c;我们顺利的 安装了 ubuntu server 服务器&#xff0c;并且配置好了 ssh 免密登录服务器&#xff0c;也安装好了 服务器常用软件安装,接下来&#xff0c;我们要仔细的配置一下我们的终端环境&#xff0c;让服务器的终端更加好用。 一般情况下…

AI大模型开发架构设计(21)——LLM大模型构建AI Agents案例实战

文章目录 1 AI Agent 智能体以及应用场景剖析什么是 AI Agent 智能体?什么是大语音模型?LLM 大模型存在的局限性LLM Agent是什么?2 基于 LLM 大模型的 AI Agent 技术架构深度剖析规划能力是什么?记忆能力是什么?工具使用能力是什么?1 AI Agent 智能体以及应用场景剖析 什…

(Python)列表的操作(增删改查、排序)

一、增 append()【整体添加&#xff0c;将一个元素整体添加】 2.extend()【分散添加&#xff0c;将元素逐一添加】 insert()【在制定位置插入元素】 二、删 del【根据下标删除】 pop【根据下标删除】 remove【根据值进行删除&#xff0c;默认指定删除第一个出现的元素】 三、…

【更正补全】edu教育申请通过方案

见字如面&#xff0c;竹相左边 只分享验证可行的前沿技术。明年还要做设计 端午出差前我申请了3个谷歌账号&#xff0c;用来测试北卡莱纳州立大学申请edu教育邮箱。很可惜直到儿童节当天都没有收到后续的邮件。 但是经过我的反复对比研究&#xff0c;我找到了更正的方案。特…

pikachu靶场通关笔记10 XSS关卡06-XSS之盲打

目录 一、XSS盲打 二、源码分析 1、进入靶场 2、源码分析 3、渗透思路 三、渗透实战 1、探测是否有过滤 2、管理员端查看输出 3、盲打页面注入Payload 4、管理员查看攻击效果 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c…

抛砖引玉:RadarDet4D,NuScenes数据集Radar模态目标检测第二名(即将开源)

这几年一直在关注自动驾驶3D目标检测相关的研究。在NuScenes数据集上有很多经典的模型被提出并得到了验证&#xff0c;纯视觉3D目标检测经典的方法有BEVFormer、BEVDet系列、DETR3D、Sparse4D等工作&#xff0c;基于LiDAR的有CenterPoint、多模态有BEVFusion、DAL、UniTR等。 …

《多状态DP:状态设计与状态转移方程速成指南》​

1.按摩师 题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;从一个预约请求队列中&#xff0c;找出一个总预约时间最长的预约集合&#xff0c;不能选择相邻位置的预约 算法讲解&#xff1a;动态规划 1.状态表示&#…