这几天又复习了一遍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连接语句的朋友有所帮助。谢谢你的支持。