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




视图可参考第六篇:




1.基本连接


基本连接的语法如下。





sql server 连接数sleep_SQLServer





举例说明,AdventureWorks2012数据库中的Person.EmailAddress和Person.Password两个表中存储着各自的邮箱和密码,如下图。为了方便查找,需要把邮箱和密码放在同一个表中进行查看。




sql server 连接数sleep_sql server_02

     


操作步骤:在新建查询中输入



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



即可,结果如下图



sql server 连接数sleep_数据库_03





2.内连接


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





sql server 连接数sleep_SQLServer_04





select a.BusinessEntityID,a.EmailAddress,b.PasswordHash
from Person.EmailAddress a inner join Person.Password b
on a.BusinessEntityID=b.BusinessEntityID         //前三行即可实现与基本连接相同的功能:on与基本连接中的where对应,inner join(可省略inner)与基本连接的where对应
where a.BusinessEntityID<=10     
order by a.BusinessEntityID DESC     //这两行的扩展功能是选取BusinessEntityID的前10行并按降序排列



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




sql server 连接数sleep_数据库_05





3.左、右外连接与全连接


在介绍左、右外连接之前,先介绍内外连接的区别:


内连接: 消除两个表中不匹配的行,比如a表有5行,b表有4行,它们之间通过“a.c=b.c”建立连接,那么最终结果只是输出4行数据


外连接:有主、从表之分。是通过主表取匹配从表,如果主表在从表中找到了匹配行,则返回查询结果, 若无匹配行,仍然返回主表的值



3.1左外连接


仍然以EmailAddress与Pasword两表为例(谁让它们比较简单呢,就拿它们俩开刀吧~)


删除Password第一行的PasswordHash数据,以便观察结果。



select a.BusinessEntityID,a.EmailAddress,b.PasswordHash
from Person.EmailAddress a left outer join Person.Password b     //主要改变在这行,left outer(outer可省略)表示EmailAddress为主表,Password为从表
on a.BusinessEntityID=b.BusinessEntityID



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





sql server 连接数sleep_sql server 连接数sleep_06




3.2右外连接


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





sql server 连接数sleep_SQL_07




3.3全连接


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





sql server 连接数sleep_sql server 连接数sleep_08




4.交叉连接


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




sql server 连接数sleep_SQL_09





新建查询中输入


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进行配对。


    




sql server 连接数sleep_sql server 连接数sleep_10




5.自连接


自连接顾名思义就是在 同一个表上进行数据连接。


自连接的操作较为简单,新建查询中输入



select a.BusinessEntityID,b.EmailAddress
from Person.EmailAddress a,Person.EmailAddress b     //此处类似第一节中的基本连接,不过a,b两个表相同
where a.BusinessEntityID=b.BusinessEntityID
order by BusinessEntityID




即可,结果如图所示



sql server 连接数sleep_sql server 连接数sleep_11