内连接与外连接(全网最详细)

article/2025/9/26 6:28:13

目录

前言

一、内连接

二、外连接

1.左外连接

2.右外连接

3.满外连接

三、UNION的使用

四、7种SQL JOINS的实现


前言

      在学习内连接与外连接之前,你不妨思考为什么要引入这两种连接方式,带着问题去学习,更有助于我们对知识的学习。

        其实在单表查询中,我们是不会接触到内外连接查询的,内外连接查询的方式只是针对我们对于多表的查询,只不过这种方式在实际应用中的方式会根据不同业务需求去使用不同的方式来查询多表。


一、内连接

内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

语法:

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;

类似这样:

方式一:
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);方式二:
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;

先看这样一段代码:

select  员工表.id,部门表.departmentfrom 员工表,部门表where 员工表.部门id=部门表.部门id;     

这种查询方式:

它会把所有的符合where条件的字段查询出来。听起来十分合理,但是有这样一种这样的情况:就是两张表的数据有的不存在某种关系。(例如:员工表中有的员工他没有部门)

 缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。

于是我们引入外连接。

二、外连接

查询多表时一般要求中出现:查询所有的数据时,就一定会用到外连接。(重点记忆

外连接:

  两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的 行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

(mysql不支持sql92,所以我们在写的外连接的语法都是sql99的)

                                        

1.左外连接

  • 语法:
 
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

2.右外连接

  • 语法:
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

3.满外连接

满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

由于mysql不支持FULL JOIN,于是我们需要用 LEFT JOIN UNION RIGHT join代替。

三、UNION的使用

  • 语法:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

  • 举例:
普通查询:
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;使用union关键字查询:
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;    (把这种数据查询出来取并集)

具体用法:

UNION:会执行去重操作
UNION ALL:不会执行去重操作
结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,
则尽量使用UNION ALL语句,以提高数据查询的效率。
 

四、7种SQL JOINS的实现

 

 中图左上图右上图我们已经解决过了,分别对应内连接左外连接以及右外连接


  • 左中图

思路:把左外连接查询出来的数据进行条件筛选

#实现A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;   (把数据进行剔除)

例子:

#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL

先进行查询  再把数据进行where筛选


  • 右中图

思路:把右外连接查询出来的数据进行条件筛选

#实现B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

例子:

#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

把数据查询出来 再进行筛选


  • 左下图 (满外连接)

思路:使用union关键字来把数据库中查询的左外连接与右外连接查询出来的数据进行合并

值得注意的是:

union all 来合并两个表中数据效率会高一些。

#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

例子:

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

  • 右下图

思路:将左中图与右中图的数据合并起来

#实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

例子:

#右下图
#左中图 + 右中图 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL


http://chatgpt.dhexx.cn/article/3HZfQ1I5.shtml

相关文章

LDF explorer使用问题记录

本文章并不是使用教程! 问题1:信号必须要设置“Unit”值 当信号时枚举值或其他非物理信号,我们不为其设置Unit属性时,通过NCF工具生成源文件时,会报错,如下图所示: 通过文本方式打开ldf文件…

SqlServer如何导入mdf、ldf文件

1、sqlserver数据库中可以直接拷贝mdf和ldf文件对sqlserver数据库中的数据进行备份,然后通过数据库管理软件加载mdf和ldf文件加载数据库数据。 2、如果拷贝mdf和ldf文件失败时可以先在服务中停止SQL Server(MSSQLSERVER)服务 3、如下两种方法亲证都可行 第一种方法…

SqlServer2008Ldf文件过大处理

ldf文件是数据库的操作日志文件,用于数据库的数据恢复; 缩小体积的方法: 第一步:设置数据库成简单模式,在master下执行 ALTER DATABASE databasename SET RECOVERY SIMPLE; 第二步:缩小数据库体积到1024MB …

SqlServer怎么导入mdf、ldf文件

第一种方法: 1.打开SQL Server,写好登录名和密码点击连接. 2.打开数据库,右键某一个数据库,选择“新建查询(Q)”。 3.再代码界面输入如下代码,点击F5键或者点击运行按钮即可。 代码如下: EXEC…

sql server处理/压缩LDF文件

LDF/MDF文件太大了,要压缩处理 SELECT NAME, recovery_model_desc FROM sys.databases 查看是什么模式这里的DNName_Log 如果不知道在sys.database_files里是什么名字的话,可以用以下注释的语句进行查询 USE DNName GO SELECT file_id, nameFROM s…

服务器mdf ldf文件,sqlserver2008如何导入mdf,ldf文件

网上找了很多解决sql server导入其他电脑拷过来的mdf文件,多数是不全,遇到的解决方法不一样等问题,下边是找到的解决问题的最全面方法! 将mdf, ldf文件导入到sql server 2008数据库当中,下面提供两种办法: …

ldf文件怎么储存到mysql中_sqlserver数据库的ldf文件太大,我们如何压缩ldf日志文件...

使用sqlserver数据库的数据有两个文件,分别是mdf和ldf。 mdf是数据文件,另外一个ldf为日志文件。随着网站的运行,你会发现ldf这个文件会越来越大,我们如何压缩ldf日志文件。 网上有很多收缩ldf文件的方法,但比较杂乱&a…

SQLServer数据库丢失ldf文件的恢复

某个数据库例如CXPT2,只把CXPT2.mdf文件留下来了,ldf文件没有留下来, 启动的时候显示显示 CXPT2[可疑],不知道怎么解决,这时候CXPT2.mdf目录下有一个旧的ldf文件, 后来看了网上的帖子,就把ldf…

mdf ldf 导入 mysql_mdf, ldf文件导入到sql server 2005的方法

在实际的工作中, 有很多涉及到数据库资料的备份,转移, 恢复等方面的工作, 但是并不是所有的资料都是以.bak格式存在的, 比如说, 你想从正在运行的数据库中把mdf, ldf格式的文件导出来,而在正在运行的数据库中则不能进行这样的操作, 同样, 当你已经拥有了mdf, ldf这样的文件想导…

LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(四)之工具使用

工具使用 一、摘要1.描述2.关键字 二、什么时候需要使用MatrixCreat工具三、MatrixCreat转换后效果图四、MatrixCreat运行环境五、MatrixCreat使用介绍六、MatrixCreat配置详解1.ProjectName2.EndianType3.BitsName4.SheetName5.ParasRowNum6.VariableNameLenth7.NameIsEqual8.…

mdf ldf 转mysql_SQL Server的ldf和mdf文件转移

再仔细检查一下,发现是MSSQLDATA文件夹下,有太多的mdf和ldf文件了,而且有几个是好几G大小的。其实就是这两个文件。 平时各种还原库,也不太注意这个,没想到后果这么严重,于是在网上搜索研究了一下怎么把这些…

S32DS导入外部LDF文件出错处理办法

文章目录 前言1.LIN版本更迭2.LDF简介2.1 LIN2.1版本LDF2.1.1 全局定义2.1.2 节点定义2.1.3 信号定义2.1.3.1 标准信号定义2.1.3.2 诊断信号定义(可选) 2.1.4 帧定义2.1.4.1 无条件帧定义2.1.4.2 事件触发帧定义(可选)2.1.4.3 零星…

【从LDF到C语言】

从LDF到C语言 frame的Init list 汽车电子中我们经常要将LDF翻译成C语言。其中有不少需要注意的点。 frame的Init list 下面举一个例子。 LDF中有一个Frame名为Test_cmd, 这个frame中有很多的signal如下图 从图中可以看出,Signal在Frame中并不是连续排列的。 第一个…

ADSP21489工程中LDF文件配置详解

一直都没有搞懂LDF文件是怎么回事,后续翻到这个文档<cces-LinkerUtilities-manual.pdf>才认真的看了一下 先搞懂ADSP21489的片上RAM空间大小是5Mbit 5Mbit 160k字的32位数据 320k 字的16位数据 106.7k字的48位指令(或40位数据)或不同大 小字的组合 只要不超过…

服务器mdf ldf文件,数据库mdf和ldf文件上传到服务器

数据库mdf和ldf文件上传到服务器 内容精选 换一换 使用DLI提交SQL作业查询数据。基本流程如下&#xff1a;步骤1&#xff1a;登录华为云步骤2&#xff1a;上传数据至OBS步骤3&#xff1a;登录DLI管理控制台步骤4&#xff1a;创建队列步骤5&#xff1a;创建数据库步骤6&#xff…

BUSMASTER LDF编辑工具制作LDF文件

本文摘要&#xff1a;本文章介绍如何使用BUSMASTER V3.2.2软件中的LDF编辑工具制作LDF文件 使用软件&#xff1a;BUSMASTER V3.2.2 -> LDF Editor 软件下载地址&#xff1a; https://download.csdn.net/download/m0_50669075/85190261 以下叙述的步骤只是为了描述清晰&a…

mdf ldf 导入 mysql_mdf和ldf导入数据库

Sql Server 错误5123/5120 附加数据库错误 Microsoft Sql Server 在附加数据库时&#xff0c;重装了系统并重命名主机名 或者 使用windows身份登陆 都有可能造成这个结果在Vista 或者Windows7下可能会报这样的错误 原因是对想要附加的数据库文件(.mdf)和日志文件(.ldf) 没有操作…

LDF文件步骤及内容详解

LDF文件第一部分——ldf文件配置 LIN_description_file; //LIN描述文件 LIN_protocol_version 2.1;//LIN协议版本 LIN_language_version 2.1; //LIN语言版本 LIN_speed 19.2 kbps; //LIN的通信速度 第一部分是必不可少的&#xff0c;属于全局定义。我们可以把等号左边…

LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(二)之LDF文件创建

LDF文件创建 一、摘要1.描述2.关键字 二、什么是LDF文件三、LDF创建环境四、LDF创建过程1.软件运行2.新建LDF文件3.修改主节点信息4.修改从节点信息5.新建描述信号6.新建信号消息7.新建报文信息8.新建调度表9.新建其他信息 五、MatrixCreat工具六、其他七、参考 一、摘要 1.描…

LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(三)之LDF文件详解

LDF文件详解 一、摘要1.描述2.关键字 二、为什么要了解LDF文件三、LDF文件构成1.版本2.波特率3.节点信息4.信号信息5.诊断信号信息6.报文消息7.诊断报文消息8.从节点信息9.调度表10.描述信息11.信号描述关联 四、LDF文件解析1.解析版本2.解析节点信息3.解析调度表4.解析报文消息…