内连接和外连接

xiaoxiao2021-02-28  88

在之前,我对MYSQL中的内连接和外连接所得出的数据集不是很清楚。这几天重新温习了一下SQL的书本,现在的思路应该是很清楚了,现在把自己的理解发出来给大家温习下。希望和我一样对SQL的连接语句不太理解的朋友能够有所帮助。(发这么菜的教程,各位大大们别笑话偶了,呵:D 有两个表A和表BA结构如下: Aidint;标识种子,主键,自增ID Anamevarchar 数据情况,即用select * from A出来的记录情况如下图1所示:1:A表数据B结构如下: Bidint;标识种子,主键,自增ID Bnameidint 数据情况,即用select * from B出来的记录情况如下图2所示:2:B表数据 为了把BidAid加以区分,不让大家有误解,所以把Bid的起始种子设置为100SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在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://www.6miu.com/read-62412.html

最新回复(0)