SQL中inner join、outer join和cross join

来源:互联网 发布:egd网络黄金美国上市 编辑:程序博客网 时间:2024/05/16 12:51

现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的:

Table A 是左边的表。Table B 是右边的表。

1.INNER JOIN 内连接 产生的结果是AB的交集

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
INNER JOIN 产生的结果是AB的交集          INNER JOIN 产生的结果是AB的交集

2.LEFT [OUTER] JOIN  左(外)连接  产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值           LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值

3.RIGHT [OUTER] JOIN 右(外)链接 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.name = TableB.name
图标如left join类似。


4.FULL [OUTER] JOIN 全外链接 产生A和B的并集。对于没有匹配的记录,则会以null做为值。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 
你可以通过is NULL将没有匹配的值找出来:
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null 
 FULL [OUTER] JOIN 产生A和B的并集           FULL [OUTER] JOIN 产生A和B的并集

MySQL本身不支持full join(全连接),但可以通过union来实现


5. CROSS JOIN 交叉连接  把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。
SELECT * FROM TableA CROSS JOIN TableB 

join的方式不同,cross join生成时是先生成笛卡尔集,然后on连接条件被视为了filter用于数据过滤,inner join是直接基于join condition做连接,生成的join集合就是最终的输出结果,产生的中间数据更小。实际上MySQL优化器会将这两条查询都优化成同一种join方式,比如merge join或者nested loop join,如果你没有开启对应的优化参数,那么MySQL只有傻傻的去按指定的方式去做join

cross join  加on语法可以视作等同于inner join  on,不加on时则为求取笛卡尔积,其他left,right,inner必须加on    full join在mysql中不支持

0 0
原创粉丝点击