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_
Nmae | City | Years |
---|---|---|
甲 | ChengDu | 25 |
乙 | WuHan | 27 |
丙 | ChongQing | 24 |
丁 | WuHan | 28 |
戊 | 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.Nmae | t1.City | t1.Years | t2.Nmae | t2.City | t2.Years |
---|---|---|---|---|---|
甲 | ChengDu | 25 | 甲 | ChengDu | 25 |
乙 | WuHan | 27 | 乙 | WuHan | 27 |
乙 | WuHan | 27 | 丁 | WuHan | 28 |
丙 | ChongQing | 24 | 丙 | ChongQing | 24 |
丁 | WuHan | 28 | 乙 | WuHan | 27 |
丁 | WuHan | 28 | 丁 | WuHan | 28 |
然后, t2.Name = '乙'
过滤出姓名符合要求的人的表:
t1.Nmae | t1.City | t1.Years | t2.Nmae | t2.City | t2.Years |
---|---|---|---|---|---|
乙 | WuHan | 27 | 乙 | WuHan | 27 |
丁 | WuHan | 28 | 乙 | WuHan | 27 |
最终结合 Select
语句筛选出目标内容。
如例,Table_
表在 From
语句中出现了两次,这是合法的。但是在 Select
、Where
语句中对列的引用时,存在歧义性。故此,为了避免歧义,必须对表命别名,并对列进行完全引用。
自然联结(natural join)
标准的联结(前文的 内联结)返回所有数据(这里主要指数据列),相同的列可能出现一次或者多次(被联结的列),而自然联结排除多次出现,使每个列只出现一次。
但是标准的SQL语句不能完成这一工作,需要我们手动完成,通常情况下是我们在 Select
语句中,对其中一个表使用通配符 Table1.*
,对其它表使用完整的列名 Table2.Column1
、Table2.Column2
…
外联结(outer join)
联结 (没有过滤条件时)实质上是两个表的行的排列组合,形成一个笛卡儿积1
内联结又称等值联结,在联结的基础上过滤出在定义列中能够关联(值相等)的数据行
外连接 则在 内联结2 的基础上,还返回部分不能关联的数据行,外连接是分方向的,有 Left Outer Join
和 Right 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