SQL学习笔记

联结

创建联结的方式非常简单,指定要联结的表和它们的联结方式即可(Table1.PRIMARY_KEY=Table2.FOREIGN_KEY ,即表1.主键=表2.外键

在创建联结时,实际上是将第一个表的每一行与第二个表的每一行配对(形成一个 笛卡儿积1),而不管他们逻辑上是否能够匹配。因此,为了获得想要的唯一结果,需要指定联结的键

内联结(等值联结)

等值联结(equijion)

使用 Where 子句进行联结

Select Table1.Columns_, Table1.Columns_ 
From Table1, Table2
Where Table1.ColumnX = Table2.ColunmY

内联结(inner join)

以上语法基于两个表之间的相等测试实现,也称为 内联结。我们可以使用不同的语法实现,明确指定其联结类型:

Select Table1.Column_, Table2.Column_ 
From Table1 Inner Join Table2
On Table1.ColumnX= Table2.ColumnY

自联结(self-join)

顾名思义,自联结就是数据表自身的联结。
使用自联结时,首先应学会使用 表别名,使用方法不做赘述。

为了更好的理解 自联结,我们首先假设有以下表 Table_

NmaeCityYears
ChengDu25
WuHan27
ChongQing24
WuHan28

戊 | WuHan | 19
己 | Chengdu | 24
庚 | BeiJing | 24

要求筛选出和 “乙” 在同一个城市(WuHan)的人的信息,代码如下:

Select t1.* 
From Table_ As t1, Table_ As t2
Where t1.City = t2.City
	  And t2.Nmae = '乙'

首先两个表会联结成为一个 笛卡儿积1表,其次通过 t1.City = t2.City 先过滤成为如下表:

t1.Nmaet1.Cityt1.Yearst2.Nmaet2.Cityt2.Years
ChengDu25ChengDu25
WuHan27WuHan27
WuHan27WuHan28
ChongQing24ChongQing24
WuHan28WuHan27
WuHan28WuHan28

然后, t2.Name = '乙' 过滤出姓名符合要求的人的表:

t1.Nmaet1.Cityt1.Yearst2.Nmaet2.Cityt2.Years
WuHan27WuHan27
WuHan28WuHan27

最终结合 Select 语句筛选出目标内容。

如例,Table_ 表在 From 语句中出现了两次,这是合法的。但是在 SelectWhere 语句中对列的引用时,存在歧义性。故此,为了避免歧义,必须对表命别名,并对列进行完全引用。

自然联结(natural join)

标准的联结(前文的 内联结)返回所有数据(这里主要指数据列),相同的列可能出现一次或者多次(被联结的列),而自然联结排除多次出现,使每个列只出现一次。
但是标准的SQL语句不能完成这一工作,需要我们手动完成,通常情况下是我们在 Select 语句中,对其中一个表使用通配符 Table1.*,对其它表使用完整的列名 Table2.Column1Table2.Column2

外联结(outer join)

联结 (没有过滤条件时)实质上是两个表的行的排列组合,形成一个笛卡儿积1
内联结又称等值联结,在联结的基础上过滤出在定义列中能够关联(值相等)的数据行
外连接 则在 内联结2 的基础上,还返回部分不能关联的数据行,外连接是分方向的,有 Left Outer JoinRight Outer Join,部分数据库还支持 全外连接(Full Outer Join

左外连接(Left Outer Jion)

Select t1.*, t2.*
From Table1 as t1 Left Outer Join Table2 as t2
On t1.ColumnX = t2.ColumnY

Left 指的是返回 Outer Jion 左侧表(t1)的所有行,右侧表(t2)有关联值时,返回关联行;右侧表(t2)没有相应的关联值时,返回 Null

如果你 Excel 还可以,懂得 VLookup 函数的话,可以用来对比理解:
在这里, t1.ColumnX 相当于 要查找的值,t2 相当于被查找的数据表,t2.ColumnY 相当于被查找的列。当 t1.ColumnX 存在时(即在 t2.ColumnY 中可以匹配到时),VLookup 函数返回的是对应的值,SQL返回对应的数据行;当不存在时,VLookup 函数返回的是错误,而 SQL里面返回的是 Null。

右外连接(Right Outer Jion)

Select t1.*, t2.*
From Table1 as t1 Right Outer Join Table2 as t2
On t1.ColumnX = t2.ColumnY

同左外连接同理,返回的是 Outer Jion 右侧表的所有行,左侧表匹配到关联之的,返回数据行;左侧表没有匹配到值的部分返回 Null

全外连接(Full Outer Jion)

Select t1.*, t2.*
From Table1 as t1 Full Outer Join Table2 as t2
On t1.ColumnX = t2.ColumnY

全外连接则是兼顾以上两者,左右两侧表的所有行,能够关联的进行关联,不能够关联的部分全部填充 Null


  1. 由没有联结条件的多个表联结,返回的结果为笛卡儿积。检索出的表行数目时几个表行数的乘积,实际上相当于两个表中所有行的排列组合。 ↩︎ ↩︎ ↩︎

  2. 注意,这里不是笔误。确实是“内联结”,而非“联结”。“联结”是排列组合,而外连接更接近“匹配” ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值