欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL联合查询inner join、outer join和cross join的区别详解

程序员文章站 2022-06-13 12:05:08
对于开发使用到数据库的应用,免不了就要使用联合查询,sql中常用的联合查询有inner join、outer join和cross join;这三者的区别很多人都应该不是很...

对于开发使用到数据库的应用,免不了就要使用联合查询,sql中常用的联合查询有inner join、outer join和cross join;这三者的区别很多人都应该不是很清楚,包括我自己,下面我们一起来看看,如果你使用join连表,缺陷的情况下是inner join,另外,开发中使用的left join和right join属于outer join,而outer join还包括full join.下面我通过图案让大家认识它们的区别。

现有两张表,table a 是左边的表。table b 是右边的表。其各有四条记录,其中有两条记录name是相同的:

SQL联合查询inner join、outer join和cross join的区别详解

1.inner join 产生的结果是ab的交集

select * from tablea inner join tableb on tablea.name = tableb.name

SQL联合查询inner join、outer join和cross join的区别详解

2.left [outer] join 产生表a的完全集,而b表中匹配的则有值,没有匹配的则以null值取代。

select * from tablea left outer join tableb on tablea.name = tableb.name

SQL联合查询inner join、outer join和cross join的区别详解

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 

SQL联合查询inner join、outer join和cross join的区别详解

5. cross join 把表a和表b的数据进行一个n*m的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。

select * from tablea cross join tableb 

通过上面的比对,相信大家对inner join、outer join和cross join的区别已一目了然了。

补充

为什么最好用join?因为用“,”做表连接的话,a,b表直接产生笛卡尔积,然后在用where筛选结果。但是join连接,a,b表连接的时候就会根据on后面的条件筛选,然后在根据where条件筛选结果

按照sql标准cross join是笛卡尔积。但对于mysql来说,cross join 相当于 inner join。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接