内连接、外连接、交叉连接等

简介:

连接,实际是将两个表做笛卡尔积生成临时表,再进行过滤的操作。

对于多表连接,也是先对两个表操作,生成临时表再合并(类似reduce)。

名称:

名字是有各种各样,简单分类下:

内连接。

外连接:分左外连接,右外连接,全外连接(或叫完全连接)。

交叉连接。

联合连接(不是联合查询)。

使用方法:

内连接:

看个例子:

SELECT a.Id, b.Id from Person a, Address b INNER OUTER JOIN  ON a.Id = b.Id;

对两个表做笛卡尔积,判断on的条件是否成立,如果成立,则添加到临时表。

其中OUTER可以省略,后面都省略了。

左连接:

SELECT a.Id, b.Id from Person a, Address b LEFT JOIN ON a.Id = b.Id;

和右连接相似。如果on中条件不成立,则右表当做NULL,必定返回左表内容!

全连接:

即使条件不成立,当做NULL,无论左表还是右表。

其他连接:

自然连接:不指定on,自动寻找相同名称的列。

交叉连接:cross join,完全笛卡尔积,很少用。

联合连接:取全连接和内连接的差UNION JOIN,似乎mysql和oracle都没有实现。

联合查询:不是连接操作,是union,取并集,需要两个查询列数相同,不用类型相同,行合并。

隐式内连接:没有inner join,只有where和两个表。

注意:

注意on和where:

on是在产生临时表的过程中的约束条件,如果是左连接,必定有左表字段。

where是产生临时表后,进行约束,没有left join等特性,即左表可能没有。

结论:不要在on后接where,除非是内连接

 

posted on 2018-01-31 20:35  willaty  阅读(226)  评论(0编辑  收藏  举报

导航