内连接与外连接的区别是什么?_数据库外连接和内连接的区别

内连接与外连接的区别是什么?_数据库外连接和内连接的区别有两个表A和表B。表A结构如下:Aid:int;标识种子,主键,自增IDAname:varchar数据情况,即用select*fromA出来的记录情况如下图1所示:图1:A表数据表B结构如下:Bid:int;标识种子,主键,自增IDBnameid:int数据情况,即用select*fromB出来的记录情况如下图2所示:图2:B表数据为了把Bid和Aid加以区分,不让大家有误解,所以把B…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

有两个表A和表B
A结构如下:
Aidint;标识种子,主键,自增ID
Anamevarchar

数据情况,即用select * from A出来的记录情况如下图1所示:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别
1:A表数据

B结构如下:
Bidint;标识种子,主键,自增ID
Bnameidint

数据情况,即用select * from B出来的记录情况如下图2所示:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别
2:B表数据

为了把BidAid加以区分,不让大家有误解,所以把Bid的起始种子设置为100
SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在A表中的AidB表中的Bnameid就是两个连接字段。
下图3说明了连接的所有记录集之间的关系:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别

3:连接关系图

现在我们对内连接和外连接一一讲解。
1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C
语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
运行结果如下图4所示:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别
4:内连接数据

其实select * from A,B where A.Aid=B.BnameidSelect * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。
2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN
   (1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。     
      语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
      运行结果如下图5所示:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别
5:左连接数据

      说明:
            在语句中,AB的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=3公共部分记录集C+表A记录集A1
            在图3中即记录集C中的存在的Aid为:2 3 6 7 8           
            图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9
            表A记录集A1中存在的Aid=(1中即A表中所有Aid)-(3中即记录集C中存在的Aid),最终得出为:1 4 5 9
            由此得出图5A左连接B的记录=3公共部分记录集C+表A记录集A1,
            最终得出的结果图5中可以看出BnameidBidNULL的记录都为图3公共部分记录集C中的记录;BnameidBidNULLAid1 4 5 9的四笔记录就是表A记录集A1中存在的Aid

   (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1
      语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
      运行结果如下图6所示:

内连接与外连接的区别是什么?_数据库外连接和内连接的区别
6:右连接数据

      说明:
            在语句中,AB的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=3公共部分记录集C+表B记录集B1
            在图3中即记录集C中的存在的Aid为:2 3 6 7 8           
            图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11
            表B记录集B1中存在的Bnameid=(2中即B表中所有Bnameid)-(3中即记录集C中存在的Aid),最终得出为:11
            由此得出图6A右连接B的记录=3公共部分记录集C+表B记录集B1,
            最终得出的结果图6中可以看出AidAnameNULL的记录都为图3公共部分记录集C中的记录;AidAnameNULLAid11的记录就是表B记录集B1中存在的Bnameid
     
总结:

通过上面的运算解说,相信很多人已经想到,上面的情况(包括图3的关系图)说明的都只是AB的左边的情况,
以下语句BA的右边的又会出现什么情况呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid

其实对图3左右翻转一下就可以得出以下结论:
select * from B Left JOIN A ON A.Aid=B.Bnameidselect * from A Right JOIN B ON A.Aid=B.Bnameid所得出的记录集是一样的

select * from B Right JOIN A ON A.Aid=B.Bnameidselect * from A Left JOIN B ON A.Aid=B.Bnameid所得出的记录集也是一样的。


你是要弄清楚区别在什么地方还是单纯想要文字说明

文字说明的楼上说了一大堆了,不说了。

弄个例题,直观一点。两个表:

stu

id  name   

1,  Jack

2,  Tom

3,  Kity

4,  nono

exam

id   grade

1,   56

2,   76

11,  89

内连接 (显示两表id匹配的)

select stu.id,exam.id,stu.name, exam.grade from stu inner join exam on stu.id=exam.id

stu.id   exam.id  name     grade

——————————–

1 1 Jack 56

2 2 Tom 76

左连接(显示join 左边的表的所有数据,exam只有两条记录,所以stu.id,grade 都用NULL 显示)

select stu.id,exam.id,stu.name, exam.grade from stu left join exam on stu.id=exam.id

1 1 Jack 56

2 2 Tom 76

3 NULL Kity NULL

4 NULL nono NULL

右连接(与作连接相反,显示join右边表的所有数据)

select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id

1 1 Jack 56

2 2 Tom 76

NULL 11 NULL 89

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184264.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 模板消息php40008,企业微信发送模板消息 40008 Warning: wrong json format. ?

    模板消息php40008,企业微信发送模板消息 40008 Warning: wrong json format. ?同样的入参,在单元测试,本地启动服务调用均正常,在某个机器一直返回错误{“touser”:”abingnew”,”msgtype”:”miniprogram_notice”,”miniprogram_notice”:{“title”:”测试标签”,”page”:”/pages/index/index”,”description”:”阿炳new向您发来推广任务”,”appid…

    2022年6月10日
    143
  • QML入门教程:一、QML和QtQuick简介以及QML实例

    QML入门教程:一、QML和QtQuick简介以及QML实例从Qt4.7开始,Qt引入了一种声明式脚本语言,称为QML(QtMetaLanguage或者QtModelingLanguage),作为C++语言的一种替代。而QtQuick就是使用QML构建的一套类库。QML是一种基于JavaScript的声明式语言。在Qt5中,QML有了长足进步,并且同C++并列…

    2025年8月13日
    2
  • 【Linux学习】Linux命令卸载软件

    【Linux学习】Linux命令卸载软件1、打开一个终端,输入dpkg–list,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。2、在终端中找到你需要卸载的软件的名称,列表是按照首字母排序的。3、在终端上输入命令sudoapt-get–purgeremove包名(–purge是可选项,写上这个属性是将软件及其配置文件一并删除,如不需要删除配置文件,可执行sudoapt-getremove包名),此处我要删除的是polipo,那么在终端输入sudoapt-get–purgeremovep

    2025年10月14日
    3
  • 国外代理服务器ip哪个好用?

    国外代理服务器ip哪个好用?哪个类型的IP代理运行得更好?人们在网上冲浪时,常常无意中暴露自己的IP地址,是因特网链路级网关提供的一个重要安全功能,主要工作于开放系统互连(Osl)模型的对话层上,因此可以作为防火墙。那什么类型的IP代理运行得更好呢?目前市场上代理IP的品牌很多,虽然都是代理IP,但具体的功能也各不相同,因为代理IP也有不同的种类,根据不同的需求可以选择哪种代理IP,今天万变代理小编就带你去看看哪个类型的代理IP比较好用?1、Http代理:最常用的代理,代理客户端http访问,主要是代理浏览器访问网页,一般有80、.

    2022年4月29日
    152
  • python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」

    python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」我就废话不多说了,大家还是直接看代码吧~importnumpyasnpkernel=np.array([1,1,1,2]).reshape((2,2))print(kernel)print(np.linalg.inv(kernel))注意,Singularmatrix奇异矩阵不可求逆补充:python+numpy中矩阵的逆和伪逆的区别定义:对于矩阵A,如果存在一个矩阵B,使得A…

    2022年8月21日
    5
  • CMOS图像传感器基础知识和参数理解「建议收藏」

    CMOS图像传感器基础知识和参数理解「建议收藏」CMOS图像传感器的工作原理:每一个CMOS像素都包括感光二极管(Photodiode)、浮动式扩散层(Floatingdiffusionlayer)、传输电极门(Transfergate)、起放大作用的MOSFET、起像素选择开关作用的M0SFET.在CMOS的曝光阶段,感光二极管完成光电转换,产生信号电荷,曝光结束后,传输电极门打开,信号电荷被传送到浮动式扩散层,由起放大作用的MOSFET电极门来拾取,电荷信号转换为电压信号。所以这样的CMOS也就完成了光电转换、电荷电压转换、模拟数

    2022年5月17日
    148

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号