最近参与了一个Postgresql相关的项目开发,工作中遇到关于表连接操作的处理,若想正确处理表之间的连接操作,对表的连接的操作类型和区别一定要有个清醒的认识,本文就是我对表连接操作的认识,不足支出还望多多指正!
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
连接类型 | 定义 | |
Inner Join | 内连接是最常见的一种连接,它也被称为普通连接,只连接匹配的行(仅对满足连接条件的CROSS中的列)。它又分为等值连接(连接条件运算符为"=")和不等值连接(连接条件运算符不为"=",例如between...and)。 | |
Outer Join | Full Outer Join | 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。 |
Left Outer Join | 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 | |
Right Outer Join | 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 | |
Cross Join | 笛卡尔乘积(所有可能的行对),交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。 | |
Appendix | Natural Join | 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉;而等值连接不会去掉重复的属性列。 |
Self Join | 某个表和其自身连接,连接方式可以是内连接,外连接,交叉连接 |
Inner Join:
Select * from t1,t2 where t1.id=t2.c1
Select * from t1 inner join t2 ont1.id=t2.c1
Select * from t1,t2 where t1.id between 1and 4;
Full Outer Join:
Select * from t1 full outer join t2 ont1.id = t2.c1
Left Outer Join
Select * from t1 left outer join t2 ont1.id =t2.c1;
Right Outer Join
Select * from t1 right outer join t2 ont1.id =t2.c1;
Cross Join
Select * from t1 cross join t2;
Natural Join (t1和t3表都有id列并且数据类型一样)
Select * from t1 naturaljoin t3;
Self Join
Select * from t1 as t1_s, t1;