表连接-内连接、外连接、交叉连接(内联接、外联接、交叉联接)白话区别

作者:vkvi 来源:ITPOW(原创) 日期:2008-9-1

我们用 A 代表 join 左边的表,B 表代表 join 右边的表。

内连接

只有 A 表的某条记录和 B 表的某条记录符合连接 ON 条件,才返回该记录。以最具代表性的相等连接作为讲解,其它两种内连接,看了后面的文章就一下明白了。

我们可以打个比方:在一个舞会上,男士代表 A 表、女士代表 B 表,某个人就代表某条记录,舞池就代表最终结果,男士中的 a 和女士中的 b,相互看上眼了(也就是符合连接 ON 条件),就携手进入舞池了,而那些没有心仪对象的人,他们就留在座位上,也就是说他们没有出现在结果中。

左向外连接

A 表记录全部返回,然后再根据连接 ON 条件决定 A 表哪些记录附加 B 表的哪些记录。

我们仍可以打个比方:在一个晚会上,男士代表 A 表,女士代表 B 表,某个人就代表某条记录,舞台就代表最终结果,每个男士必须且依次上台表演节目,他们可以根据某种条件邀请在场的不定个数的女士协助他表演,也就是说他也可以一个人表演,同一对男女组合最多表演一次,但一个女士可以和不同的男士表演,记录结果就是,凡是上过台的组合(或单人)都算一条记录(一个男士邀请了两个女士,则算两条记录)。

右向外连接

B 表记录全部返回,然后再根据连接 ON 条件决定 B 表哪些记录附加 A 表的哪些记录。

把上述比喻中,男士换成女士,女士换成男士理解就可以了。

完整外部连接

完整外部连接是左向外连接和右向外连接的结合:

  • 首先进行左向外连接
  • 然后按反方向进行右向外连接,B 表中没有在上一步结果中出现过的记录,依次列出来。

同样是前面的左向外连接节目表演例子,我们可以看作男士都表演完后,那些从来没有上台参与过表演的女士,再上台,但此时他们不得再邀请男士和她们一同表演。当然这里是先进行左向外连接还是右向外连接,得看谁的记录多,如果 A 表的记录多,则先进行左向外连接,如果 B 表的记录多,则先进行右向外连接。

为了更好地理解,我们举个例子:

--a 表有四条记录,b 表有五条记录。
select * from a full join b  on a.id=b.id and a.id=2
--结果
NULL NULL 1 b1
2    a2   2 b2
NULL NULL 3 b3
NULL NULL 4 b4
NULL NULL 5 b5
4 a4 NULL NULL
3 a3 NULL NULL
1 a1 NULL NULL

交叉连接

交叉连接就比较好理解了。假如我们把两个表理解为体育比赛的 A 组和 B 组,如果 A 组中的每个人与 B 组中的每个人比赛一次,那么就是交叉连接。

相关文章