综合几篇写的,弄成自己看的懂的了:
转载地址:
http://blog.csdn.net/scythe666/article/details/51881235
http://blog.csdn.net/xiaoshunzi111/article/details/68482772
https://www.cnblogs.com/wq3435/p/6677937.html
还有百度知道回答的:https://zhidao.baidu.com/question/2119218710040076987.html
一、MySQL中inner join 和 cross join 的区别
Inner join:内连接,也叫等值连接,inner join产生同时符合A和B的一组数据。 Cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积 笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。 Inner join 和 Cross join 的区别: 1、Cross join生成的是先生成笛卡尔集,然后on连接条件被视为了filter用于数据过滤, Inner join是直接基于join condition做连接,生成的join集合就是最终的输出结果,产生的中间数据更小。 2、Inner join结合ON子句使用;Cross join用于其它地方。 3、Cross join产生的是笛卡尔集,也就是 M*N 的集合,Inner join是内联查询,不是产生笛卡尔集。 4、Cross join不加条件限制,Inner join的on是加了条件限制的
二、inner join、cross join和left join、right join
如果你使用join连表,缺陷的情况下是inner join,
另外,开发中使用的left join和right join属于outer join,
另外outer join还包括full join.
现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的:
1.INNER JOIN 产生的结果是AB的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
2.LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
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
5. CROSS JOIN 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。
SELECT * FROM TableA CROSS JOIN TableB
相信大家对inner join、outer join、cross join和left join、right join、full join的区别一目了然了。
三、关于等值连接和自然连接及各种外连接(full join)
等值连接(=号应用于连接条件, 不会去除重复的列)
自然连接(会去除重复的列)
数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。
例如:
SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column
3. 外连接OUTER JOIN
指定条件的内连接,仅仅返回符合连接条件的条目。
外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。
1)左外连接LEFT [OUTER] JOIN
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
2)右外连接RIGHT [OUTER] JOIN
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
3)全外连接full [outer] join
显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集