内连接、外连接、交叉连接等
简介:
连接,实际是将两个表做笛卡尔积生成临时表,再进行过滤的操作。
对于多表连接,也是先对两个表操作,生成临时表再合并(类似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,除非是内连接。