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

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

视图可参考第六篇:

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.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行并按降序排列

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



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

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



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.EmailAddress
from Person.EmailAddress a,Person.EmailAddress b     //此处类似第一节中的基本连接,不过a,b两个表相同
where a.BusinessEntityID=b.BusinessEntityID
order by BusinessEntityID

即可,结果如图所示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值