内连接与外连接的区别

  • Post author:
  • Post category:其他


有两个表

A


和表


B







A


结构如下:


Aid




int


;标识种子,主键,自增


ID


Aname




varchar

数据情况,即用

select * from A


出来的记录情况如下图


1


所示:





1:A


表数据



B


结构如下:


Bid




int


;标识种子,主键,自增


ID


Bnameid




int

数据情况,即用

select * from B


出来的记录情况如下图


2


所示:





2:B


表数据

为了把

Bid





Aid


加以区分,不让大家有误解,所以把


Bid


的起始种子设置为


100







SQL


基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在


A


表中的


Aid





B


表中的


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.Bnameid





Select * 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:


左连接数据

说明:

在语句中,

A





B


的左边,并且是


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


由此得出图

5





A


左连接


B


的记录


=





3


公共部分记录集


C


+表


A


记录集


A1,


最终得出的结果图

5


中可以看出


Bnameid





Bid





NULL


的记录都为图


3


公共部分记录集


C


中的记录;


Bnameid





Bid





NULL





Aid





1 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:


右连接数据

说明:

在语句中,

A





B


的左边,并且是


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


由此得出图

6





A


右连接


B


的记录


=





3


公共部分记录集


C


+表


B


记录集


B1,


最终得出的结果图

6


中可以看出


Aid





Aname





NULL


的记录都为图


3


公共部分记录集


C


中的记录;


Aid





Aname





NULL





Aid





11


的记录就是表


B


记录集


B1


中存在的


Bnameid



总结:

通过上面的运算解说,相信很多人已经想到,上面的情况(包括图

3


的关系图)说明的都只是


A





B


的左边的情况,


以下语句

B





A


的右边的又会出现什么情况呢??


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.Bnameid




select * from A Right JOIN B ON A.Aid=B.Bnameid


所得出的记录集是一样的




select * from B Right JOIN A ON A.Aid=B.Bnameid




select * 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



版权声明:本文为dhf984721977原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。