SQL Server2008 学习之(十一) :有趣的内外连接

2017-11-28 08:13:42来源:CSDN作者:s1314_JHC人点击

分享
之前介绍的select语句都是对单一的数据表进行操作。在实际情况中,一般会涉及到对多个数据表的操作,“连接”在这种情况下就能起到很好的作用。学习之初认为连接的功能与视图类似,不过学习完之后才发现连接可以“玩出花样”,很有趣!本篇博客从基本的内连接入手,引出与内连接相关的一些外连接操作。
视图可参考第六篇:http://blog.csdn.net/s1314_JHC/article/details/78554875
1.基本连接基本连接的语法如下。


举例说明,AdventureWorks2012数据库中的Person.EmailAddress和Person.Password两个表中存储着各自的邮箱和密码,如下图。为了方便查找,需要把邮箱和密码放在同一个表中进行查看。
     操作步骤:在新建查询中输入
select a.BusinessEntityID,a.EmailAddress,b.PasswordHash     //把需要建立连接的列表示出来from Person.EmailAddress a,Person.Password b     //先写这行,把两个需要建立连接的表用a,b代替,方便select语句操作where a.BusinessEntityID=b.BusinessEntityID     //建立连接的根本是两个表有相同的列 BusinessEntityID

即可,结果如下图

2.内连接内连接与基本连接功能相似,只是表现形式不同,内连接的语法格式如下。


还是以第一节的例子为例,对于内连接,输入
select a.BusinessEntityID,a.EmailAddress,b.PasswordHashfrom Person.EmailAddress a inner join Person.Password bon a.BusinessEntityID=b.BusinessEntityID         //前三行即可实现与基本连接相同的功能:on与基本连接中的where对应,inner join(可省略inner)与基本连接的where对应where a.BusinessEntityID<=10     order by a.BusinessEntityID DESC     //这两行的扩展功能是选取BusinessEntityID的前10行并按降序排列

即可实现与基本连接相同的结果,结果如图所示


3.左、右外连接与全连接在介绍左、右外连接之前,先介绍内外连接的区别:内连接:消除两个表中不匹配的行,比如a表有5行,b表有4行,它们之间通过“a.c=b.c”建立连接,那么最终结果只是输出4行数据外连接:有主、从表之分。是通过主表取匹配从表,如果主表在从表中找到了匹配行,则返回查询结果,若无匹配行,仍然返回主表的值
3.1左外连接仍然以EmailAddress与Pasword两表为例(谁让它们比较简单呢,就拿它们俩开刀吧~)删除Password第一行的PasswordHash数据,以便观察结果。在新建查询中,输入
select a.BusinessEntityID,a.EmailAddress,b.PasswordHashfrom Person.EmailAddress a left outer join Person.Password b     //主要改变在这行,left outer(outer可省略)表示EmailAddress为主表,Password为从表on a.BusinessEntityID=b.BusinessEntityID

即可,结果如下。可以看到只要主表有数据,从表中对应行即使没数据也会显示


3.2右外连接与左外连接类似,把3.1中的left修改为right即可。此时Password变为主表。在这删除EmailAddress中的第一行EmailAddress数据,以便观察结果,右外连接结果如下。


3.3全连接全连接相比左、右外连接而言更加公平,两个表中没有从属关系,因此任何表中出现未定义的数据都不会影响最终显示,代码也仅仅是把left/right更改为“full”,结果如下。


4.交叉连接交叉连接返回两个表中各行的所有可能集合,说起来抽象,借助下面例子即可轻易理解。其语法格式如下。


新建查询中输入
select a.BusinessEntityID,a.EmailAddress,b.PasswordHash     //把需要建立连接的列表示出来from Person.EmailAddress a,Person.Password b     //先写这行,把两个需要建立连接的表用a,b代替,方便select语句操作where a.BusinessEntityID=b.BusinessEntityID     //建立连接的根本是两个表有相同的列 BusinessEntityID

即可看到所有可能的情况,如下图所示,左图表示BusinessEntityID=1时,此时的EmailAddress为ken0@adventure-works.com,它与Password表中的所有PasswordHash进行配对组成一个集合     同样的,在BusinessEntityID为其他值时,例如8中的diane1@adventure-works.com,同样也要于所有的Password进行配对。    

5.自连接自连接顾名思义就是在同一个表上进行数据连接。自连接的操作较为简单,新建查询中输入
select a.BusinessEntityID,b.EmailAddressfrom Person.EmailAddress a,Person.EmailAddress b     //此处类似第一节中的基本连接,不过a,b两个表相同where a.BusinessEntityID=b.BusinessEntityIDorder by BusinessEntityID

即可,结果如图所示

微信扫一扫

第七城市微信公众平台