sql中的inner join,sqljoin是内连接,MSSQL内外连接(INNER JOIN)语句详解

sql中的inner join,sqljoin是内连接,MSSQL内外连接(INNER JOIN)语句详解

这几天又复习了一遍SQL的书,现在思路应该很清晰了。现在我把自己的理解发出来供大家回顾。希望和我一样不懂SQL连接语句的朋友能有所帮助。

之前我对MSSQL内连接和外连接得到的数据集不是很清楚。这几天又复习了一遍SQL的书,现在思路应该很清晰了。现在我把自己的理解发出来供大家回顾。希望和我一样不懂SQL连接语句的朋友能有所帮助。(发这样的教程不要笑我,呵:D)

有两张表a和b。

a表格结构如下:

aid:int;标识种子、主键、自增ID

Aname:varchar

数据,即select*fromA的记录如下图1所示:

图1:表A数据

b表格结构如下:

bid:int;标识种子、主键、自增ID

Bnameid:int

数据,即select*fromB的记录如下图2所示:

图2:表B数据

为了区分Bid和Aid,以免被误解,将Bid的起始种子设置为100。

任何有SQL基础知识的人都知道两个表必须有一个连接字段才能连接。从上表的数据可以看出,表A中的Aid和表B中的Bnameid是两个连接字段。

3下图说明了所有连接的记录集之间的关系:

图3:连接图

现在我们来逐一解释一下内部联系和外部联系。

1.inner join:两个表的公共部分的记录可以通过使用inner join获得,即图3中的记录集C。

以下语句:select * fromajoinbona . aid=b . bnameid。

操作结果如下图4所示:

图4:内嵌数据

实际上select * from a,b where ea . aid=b . b nameid和select * from ajoinbona . aid=b . b nameid的运行结果是一样的。

2.外连接:有两种外连接,一种是LeftJOIN,另一种是RightJOIN。

(1) LeftJOIN:即图3中的公共部分记录集C+表a中的记录集A1。

以下语句:select * fromaleftjonbona . aid=b . bnameid。

操作结果如下图5所示:

图5:左侧连接数据

说明:

语句中A在B的左边,是LeftJoin,所以它的运算方式是:A连接左边B的记录=图3公共部分记录集C+表A记录集A1。

在图3中,记录集C中存在的Aid是:23678。

图1中所有记录集A,即表A中的Aid是123456789。

表A的记录集A1中存在的Aid=(图1中表A的所有Aid)-(图3中记录集C中存在的Aid),最终结果为:1459。

因此,图5中a的左连接b的记录=图3中的公共部分记录集c+表a中的记录集A1,

最终结果如图5所示。Bnameid和Bid不为NULL的记录都是图3中公共部分记录集C中的记录。具有Bnameid和NULL Bid以及Aid为1459的四个记录是存在于表a的记录集A1的Aid

(2) RightJOIN:即图3中的公共部分记录集C+表b中的记录集B1。

以下语句:select * from marightjoinbona . aid=b . bnameid。

操作结果如下图6所示:

图6:右侧连接数据

描述:

在语句中,A在B的左边,是RightJoin,所以它的操作方式是:A右连接B的记录=图3公共部分记录集C+表B记录集B1。

在图3中,记录集C中存在的Aid是:23678。

在图2中,也就是说,存在于表B的所有记录集B中的Bnameid是:2367811

表B的记录集B1中存在的bname id=(图2中表B的所有bname id)-(图3中记录集C中存在的Aid),最终结果为:11

由此得出结论,图6中的右连接B的记录=图3中的公共部分记录集C+表B中的记录集B1,

最终结果如图6所示。Aid和Aname的非空记录是图3的公共部分记录集C中的记录。Aid和Aname为空并且Aid为11的记录是存在于表b的记录集B1中的Bnameid

总结:

相信很多人通过上面对运算的解释都想过,上面的情况(包括图3的示意图)只是说明了A在B左侧的情况,

当下面的语句B在A的右边时会发生什么?

select*fromBLeftJOINAONA。Aid=B.Bnameid

select*fromBRightJOINAONA。Aid=B.Bnameid

事实上,通过左右翻转图3,可以得出以下结论:

select * frombleftjonona . aid=b . b nameid和select * frommarightjoinbona . aid=b . b nameid具有相同的记录集。

但是

select * from brightjoinaona . aid=b . b nameid和select * from aleftjoybona . aid=b . b nameid获得相同的记录集。

第一次写类似的教程帖,希望对和我一样不懂SQL连接语句的朋友有所帮助。谢谢你的支持。

sql中的inner join,sqljoin是内连接,MSSQL内外连接(INNER JOIN)语句详解