实例讲解内连接、左连接、右连接、交叉连接、外连接以及全连接

article/2025/8/17 20:26:45

目录

  • 示例表:
  • 1.内连接-inner:
    • 实例1:内连接表a和表b
    • 实例2:内连接表a和表c
    • 实例3:内连接表a和表b,使用“>”号
    • 实例4:内连接表a和表b,使用“<”号
    • 实例5:内连接表a和表b,指定字段显示
    • 实例6:内连接表a和表b,指定字段并命名显示字段
    • 总结
  • 2.左连接-left(左外连接)
    • 实例1:左连接表a和表b(左边表-表a,右边表-表b)
    • 实例2:左连接表a和修改后的表c(表d)
    • 实例3:左连接表a和表b,使用“>”号
    • 实例4:左连接表a和表b,使用“<”号
    • 实例5:左连接表a和表b,指定字段显示
    • 总结:
  • 3.右连接-right(右外连接)
    • 实例1:右连接表a和表b
    • 实例2: 右连接表a和修改后的表c
    • 实例3:右连接表a和表b,使用“<”号
    • 总结:
  • 4.交叉连接-cross
    • 实例1:交叉连接表a和表b
    • 实例2:交叉连接表a和表b,指定字段显示
    • 总结:
  • 5.外连接-full
    • 实例1:外连接表a和表b
    • 实例2:外连接表b和表a
  • 6.全连接-union
    • 实例1:不设置显示列名或两个表列名不同时
    • 实例2:两个表取出的列数或选择显示的列数不同时,报错
    • 实例3:设置显示字段名,如a_id as id,a_name as name,,,,,,,
    • 实例4:union和union all的区别
    • 实例5:对结果排序(正序、倒序)
    • 总结:
  • 7.对比
    • 7.1 内连接、左连接和右连接使用“>”、“<”号的对比
      • 关联执行的策略
      • 对比1:a_id > b.b_id;的三种情况
      • 对比2:a_id < b.b_id;的三种情况
      • 总结
        • 从左边(表a)开始,一对多比较
        • 从右边(表b)开始,一对多比较
    • 7.2 交叉连接和全连接的对比
      • 交叉连接效果图:
      • 全连接效果图:
      • 总结:
    • 7.3 postgresql与 Mysql的对比
      • 左连接对比
      • 交叉连接对比
      • 外连接对比
      • 总结:

以下为Postgresql实际操作测试数据,主要为了记录总结个人所得,可供大家参考,欢迎大家指出不当之处。

示例表:

表a,表b,表c,修改后的表c(表d)
表a
表b
表c
表d

1.内连接-inner:

数学中的交集,使用比较运算符(= < >)根据每个表共有的列的值匹配两个表中的行
关键字:inner join on
语句
select *(column1,column2,colunmnN)
from 表A
inner join 表B
on
表A.连接字段=表B.连接字段;

实例1:内连接表a和表b

语句:select * from a inner join b on a.a_id = b.b_id;
结果:
在这里插入图片描述

结论:

  1. 根据连接字段ID返回两个表中所有相同字段名、字段值

实例2:内连接表a和表c

语句:select * from a inner join c on a.a_id = c.c_id;
结果:
在这里插入图片描述

实例3:内连接表a和表b,使用“>”号

语句:select * from a inner join b on a.a_id > b.b_id;
结果:
在这里插入图片描述

结论:

  1. 取出表a中一行中的id依次和表b中的每一行的id比较

实例4:内连接表a和表b,使用“<”号

语句:select * from a inner join b on a.a_id < b.b_id;
结果:
在这里插入图片描述

实例5:内连接表a和表b,指定字段显示

语句:select a_id,a_name,a_part,b_name,b_part from a inner join b on a.a_id = b.b_id;
结果:
在这里插入图片描述

实例6:内连接表a和表b,指定字段并命名显示字段

语句:select a_id as id,a_name,a_part,b_name,b_part from a inner join b on a.a_id = b.b_id;
结果:
在这里插入图片描述

总结

只显示根据条件匹配相同的字段值a_id,b_id的行数据
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
请添加图片描述

2.左连接-left(左外连接)

关键字:left join on / left outer join on
语句
select *(column1,column2,colunmnN)
from 表A
left join 表B
on
表A.连接字段=表B.连接字段;

实例1:左连接表a和表b(左边表-表a,右边表-表b)

语句: Select * from a left join b on a.a_id = b.b_id;
结果:
请添加图片描述

实例2:左连接表a和修改后的表c(表d)

语句: Select * from a left join c on a.a_id = c.c_id;
结果:
请添加图片描述

结论:
只要条件字段值id相同,就会显示所有的行数据,不管其他的字段值是否与之相同。简而言之,只要a_id和c_id值相同,就会显示对应的行数据!!!

实例3:左连接表a和表b,使用“>”号

语句: select * from a left join b on a.a_id > b.b_id;
结果:
请添加图片描述

实例4:左连接表a和表b,使用“<”号

语句: select * from a left join b on a.a_id < b.b_id;
结果:
请添加图片描述

结论:
结果与内连接表a和表b(使用“<”号)相同。好像一旦不使用“=”号,使用“<”、“>”的话,内连接和左连接达到的效果相同

实例5:左连接表a和表b,指定字段显示

语句: Select a_id,a_name,a_part,b_name,b_part from a left join b on a.a_id = b.b_id;
结果:
请添加图片描述

总结:

首先显示左边表(在实例中指表a)的所有数据,其次加上右边表(此处指表b)根据条件匹配相同的字段值a_id,b_id的行数据
说明:
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

3.右连接-right(右外连接)

关键字: right join on / right outer join on
语句:
select *(column1,column2,colunmnN)
from 表A
right join 表B
on
表A.连接字段=表B.连接字段;

实例1:右连接表a和表b

Select * from a right join b on a.a_id = b.b_id
结果:
请添加图片描述

实例2: 右连接表a和修改后的表c

Select * from a right join c on a.a_id = c.c_id;
结果:
请添加图片描述

实例3:右连接表a和表b,使用“<”号

Select * from a right join b on a.a_id < b.b_id;
结果:
请添加图片描述

结论:
1.使用“<”,和内连接对比
select * from a inner join b on a.a_id < b.b_id;
结果:
请添加图片描述

总结:

首先显示右边表(在实例中指表b)的所有数据,其次加上左边表(此处指表a)根据条件匹配相同的字段值a_id,b_id的行数据
说明:
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
请添加图片描述

4.交叉连接-cross

关键字:cross join
语句:
select *(column1,column2,colunmnN)
from 表A
cross join 表B;

实例1:交叉连接表a和表b

**语句:**Select * from a cross join b;
结果:
请添加图片描述

实例2:交叉连接表a和表b,指定字段显示

语句: Select a_id,a_name,a_part from a cross join b;
结果:
请添加图片描述

总结:

  1. 显示比所有数据更多数据,着重注意比较顺序:从左边(表a)开始,一对多比较

5.外连接-full

关键字: full join/full outer join on
语句:
select *(column1,column2,colunmnN)
from 表A
full join 表B
on
表A.连接字段=表B.连接字段;

实例1:外连接表a和表b

语句: select * from a full join b on a.a_id=b.b_id;
结果:
请添加图片描述

实例2:外连接表b和表a

语句: select * from b full join a on a.a_id=b.b_id;
结果:
请添加图片描述

6.全连接-union

关键字:union / union all
语句:
(select colum1,colum2…columN from tableA )
union或者union all
(select colum1,colum2…columN from tableB )

实例1:不设置显示列名或两个表列名不同时

语句: (select a_id,a_name,a_part from a) union all (select b_id,b_name,b_part from b);
结果:
请添加图片描述

结论: 不设置显示列名或两个表列名不同时,以第一个sql 表列名为准

实例2:两个表取出的列数或选择显示的列数不同时,报错

语句:(select a_id,a_name from a) union (select b_id,b_name,b_part from b);
结果:
请添加图片描述

表a取出两列:a_id,a_name,而表b取出三列:b_id,b_name,b_part————列数不同
**结论:**通过union连接的SQL它们分别单独取出的列数必须相同

实例3:设置显示字段名,如a_id as id,a_name as name,

语句: (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b);
结果:
请添加图片描述

实例4:union和union all的区别

语句: (select a_id as id,a_name as name,a_part as part from a) union (select b_id,b_name,b_part from b);
结果:
请添加图片描述

语句: (select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b);
结果:
请添加图片描述

结论:
Union——显示不重复的数据(完全相等的行会被合并为一行)
Union all——显示所有的数据(包括重复的行)
由于union合并重复的行比较耗时,所以平时使用union all

实例5:对结果排序(正序、倒序)

语句:
正序
(select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b) order by id;
结果:
请添加图片描述

倒序
(select a_id as id,a_name as name,a_part as part from a) union all (select b_id,b_name,b_part from b) order by id desc;
结果:
请添加图片描述

总结:

  1. 不设置显示列名或两个表列名不同时,以第一个sql 表列名为准
  2. 与其他连接相比,需要取出某些列。通过union连接的SQL它们分别单独取出的列数必须相同
  3. Union——显示不重复的数据(完全相等的行会被合并为一行)
    Union all——显示所有的数据(包括重复的行)
    由于union合并重复的行比较耗时,所以平时使用union all
  4. 被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;

7.对比

7.1 内连接、左连接和右连接使用“>”、“<”号的对比

关联执行的策略

Mysql:当前关联执行的策略很简单:对任何关联都执行嵌套循环关联操作,即先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。

对比1:a_id > b.b_id;的三种情况

请添加图片描述

对比2:a_id < b.b_id;的三种情况

请添加图片描述

总结

对比之后的结果要从比较顺序、保留数据两个方面来看:
比较顺序:从左边(表a)开始,一对多比较、从右边(表b)开始,一对多比较(也就是前面所说的 关联执行的策略)
保留数据:匹配(符合条件)数据、不匹配数据

从左边(表a)开始,一对多比较

因为它们都是从左边(表a)开始,第一轮取出左边的第一行数据,分别和右边的每一行数据对比。第二轮取出左边的第二行数据,分别和右边的每一行数据对比,,,,依次类推。
请添加图片描述

从右边(表b)开始,一对多比较

从右边开始,第一轮取出右边的第一行数据,分别和左边的每一行数据对比。第二轮取出右边的第二行数据,分别和左边的每一行数据对比,,,,依次类推。
请添加图片描述

(1)比较顺序:
内连接——从左边(表a)开始,一对多比较
左连接——从左边(表a)开始,一对多比较
右连接——从右边(表b)开始,一对多比较

(2)保留数据:
内连接——只保留匹配(按条件判断)的数据
左连接——(在比较顺序的前提下)保留左边表的不匹配的数据+匹配数据
右连接——(在比较顺序的前提下)保留右边表的不匹配的数据+匹配数据

7.2 交叉连接和全连接的对比

交叉连接效果图:

请添加图片描述

全连接效果图:

Union(有去重的效果)
请添加图片描述
Union all(不排除重复的部分)
请添加图片描述

总结:

  1. 以上图只是大体效果图,具体行数据的排序不定

7.3 postgresql与 Mysql的对比

左连接对比

Postgresql
语句:select * from a left join b on a_id = b_id;
请添加图片描述

Mysql
语句:select * from a left join b on a_id = b_id;
请添加图片描述

结论:
结果一样,只是显示不一样

交叉连接对比

Postgresql
语句:Select * from a cross join b;
结果:
请添加图片描述
Mysql
语句:Select * from a cross join b;
请添加图片描述

结论:
Postgresql——比较顺序:从左边(表a)开始,一对多比较
Mysql——比较顺序:从右边(表b)开始,一对多比较

外连接对比

Postgresql
语句:select * from a full join b on a.a_id=b.b_id(或者a_id = b_id);
结果:
请添加图片描述

Mysql
语句:select * from a full join b on a_id = b_id;
请添加图片描述

结论:
Postgresql——显示所有数据
Mysql——只显示根据id相等的行数据

总结:

1.后面的条件约束(匹配字段)
posgresql——可使用“a.a_id = b.b_id”形式,也可使用“a_id = b_id”形式
mysql——只能使用使用“a_id = b_id”形式
2. 在左连接中:
结果一样,只是显示不一样
3.在交叉连接中:
Postgresql——比较顺序:从左边(表a)开始,一对多比较
Mysql——比较顺序:从右边(表b)开始,一对多比较
4.在外连接中:
Postgresql——显示所有数据
Mysql——只显示根据id相等的行数据

引用:

  1. https://blog.csdn.net/plg17/article/details/78758593?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
  2. https://blog.csdn.net/zjt980452483/article/details/82945663
  3. https://www.runoob.com/postgresql/postgresql-join.html

http://chatgpt.dhexx.cn/article/v8QpiFvV.shtml

相关文章

mysql 左连接查询记录数,MySQL左连接查询记录行数

最近修复一个数据问题&#xff0c;其中用到了左连接&#xff0c;我的意识里还以为A左连接B&#xff0c;查询出的记录数量会是A的记录数&#xff0c;然而实际操作后发现认知严重错。 网上关于左连接的一张图 摘自网上的一张图&#xff0c;图确实没毛病&#xff0c;但我却产生了误…

mysql左连接出现笛卡尔积_Mysql内连接、左连接会出现笛卡尔积的理解

先简单解释一下笛卡尔积。 现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4} 集合 AB 和 BA的结果集就可以分别表示为以下这种形式: AB = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}; BA = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)}; 以上AB和BA的结…

关于左右连接

首先来看一下两张主要的表&#xff1a; persons表 orders表 现在我们希望列出所有的人&#xff0c;以及他们的定购。 SELECTpersons.last_name,persons.first_name,orders.order_no FROMpersons LEFT JOIN orders ON persons.pid orders.pid ORDER BYpersons.last_nam…

LINQ左连接

title: linq左连接 date: 2021-12-05 08:45:48 tags: C# Linq LINQ语言继承查询 近日项目实践中遇到这样的一个事情。在一个项目需求里存在这么一个情况&#xff0c;有以下一个主表与几个基础数据表组成一个大表&#xff0c;要求主表中的有的数据必须展示出来&#xff0c;但大…

ClickHouse左连接

A左连接B>S1区域 1、等价方式一 SELECT date, ts, country, province, city,ye_no FROM (SELECT date, ts, country, province, city,0 AS yes_no FROM DBa.tba WHERE (date today()-1) ) ALL LEFT JOIN (SELECT date, ts, country, province, city FROM DBb.tbb WH…

【Mysql】图解左、右、内与全连接

一、前言 使用学生表与成绩表来演示Mysql中的各种连接查找 学生表的建表语句如下&#xff1a; CREATE TABLE student(id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增序号,st_id int(11) DEFAULT NULL COMMENT 学生id,st_name varchar(255) DEFAULT NULL COMMENT 学生姓名…

使用VC和MATCOM结合开发应用程序心得笔记

使用VC和MATCOM结合开发应用程序心得笔记1. 什么是Matcom?Matcom是MathTools公司(UPenn)开发的一个基于C矩阵函数库Matrix的一个matlab m文件与cpp文件的转换程序。MIDEVA为他的一个集成调试编译环境(界面)。Matcom独立于matlab之外&#xff0c;但需要外部的c编译器&…

MATLAB与VC混合编程(1)

在本节中先介绍matcom&#xff0c;使得VC能调用Matlab 的M文件&#xff0c;从而实现混合编程。 Matcom是mathTools公司推出的一个能将M文件转化成相同功能C代码的工具。相比Matlab自带的编译器Compiler&#xff0c;用Matcom转化代码要简单和方便得多。以VC6.0和Matcom为例&…

利用Matcom实现基于MATLAB的混合编程

利用Matcom实现基于MATLAB的混合编程 来源: 神经网络 作者&#xff1a;AI俱乐部 网友评论 0 条 浏览次数 42 <script> remark_look(re_look.php?cid17&tid1843); </script> Matcom是mathTools公司推出的最早的Matlab到C的编译器。后来&#xff0c;由于Mathto…

深度学习(十二):Matconvnet小试牛刀与提特征

该节简单介绍一下如何使用Matconvnet的现有的模型进行图像分类实验以及提取图像对应层的特征。 先来看看如何用训练好的imagenet网络模型进行图像的预测&#xff0c;英文版的官网教程就在这里&#xff1a; http://www.vlfeat.org/matconvnet/quick/ 检测图像分类之前&#x…

项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)

1、项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一。它合并两个图像, 即 内容图像 C&#xff08;content image&#xff09; 和 样式图像S&#xff08;style image&#xff09;, 以生成图像 G&#xff08;generated image&#xff09;。生成的图像 G 将图像 C 的 内…

Matconvnet学习笔记

Introduction to Matconvnet MatConvNet是实现用于计算机视觉领域的卷积神经网络(CNN)的MATLAB工具箱。自从取得突破性工作以来,CNN在计算机视觉领域有一个重大影响&#xff0c;特别是图像理解&#xff0c;基本上取代了传统图像表示。有许多其他机器学习、深度学习和CNN开源库的…

20190812_解决anaconda下install库的问题

20190812_解决anaconda下install库的问题 一、起因二、开始解决三、解决方法1 创建虚拟环境2 在环境中安装库3 重新配置pycharm中的解释器4 运行5 其他 一、起因 在学习PYQT5例子时&#xff0c;需要在anaconda下使用plotly库 二、开始解决 使用&#xff1a; conda install …

matlab已停止工作 win7 64,win7系统笔记本运行软件弹出“Matlab已停止工作”的解决方法...

很多小伙伴都遇到过win7系统笔记本运行软件弹出“Matlab已停止工作”的困惑吧&#xff0c;一些朋友看过网上零散的win7系统笔记本运行软件弹出“Matlab已停止工作”的处理方法&#xff0c;并没有完完全全明白win7系统笔记本运行软件弹出“Matlab已停止工作”是如何解决的&#…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历&#xff0c;但是从参加工作后&#xff0c;基本都是通过for循环遍历&#xff0c;没用过迭代器&#xff0c;于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意&#xff1a;这里只讲通过遍历同时能过获取key和value的遍…

java map集合如何遍历效率高 java中Map遍历的方式

java map集合如何遍历效率高 java中Map遍历的方式 一、前言 1、在看 《阿里巴巴java开发手册》时候&#xff0c;有一条推荐的规约&#xff1a; 【推荐】使用entrySet遍历Map类集合KV&#xff0c;而不是keySet方式进行遍历。 说明&#xff1a;keySet其实是遍历了2次&#xff0c…

【Java】Map遍历key-value的四种方法

Map遍历key-value的四种方法 &#xff08;1&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——增强for循环遍历 &#xff08;2&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——使用迭代器遍历 &#xff08;3&#xff09;通过entryS…

SVM——核函数

我们知道&#xff0c;SVM相对感知机而言&#xff0c;它可以解决线性不可分的问题&#xff0c;那么它是怎么解决的呢&#xff1f;它的解决思想很简单&#xff0c;就是对原始数据的维度变换&#xff0c;一般是扩维变换&#xff0c;使得原样本空间中的样本点线性不可分&#xff0c…

SVM核函数概述

特征空间的隐式映射&#xff1a;核函数 咱们首先给出核函数的来头&#xff1a;在上文中&#xff0c;我们已经了解到了SVM处理线性可分的情况&#xff0c;而对于非线性的情况&#xff0c;SVM 的处理方法是选择一个核函数 κ(⋅,⋅) &#xff0c;通过将数据映射到高维空间&#x…

聚类算法之核函数

一&#xff1a;监督学习与无监督学习 1&#xff0c;监督学习 监督学习就是人们常说的分类&#xff0c;通过训练已有样本得到一个最优模型&#xff0c;利用该模型将输入转化成输出&#xff0c;对输出进行判断&#xff0c;从而实现分类&#xff0c;也就是具有了对未知数据进行分类…