sql 语句中inner join、left outer join、right outer join,full join的区别

在编写SQL语句的时候,使用单表的查询相对来说还是比较少的,更多的需要使用多表关联进行查询。在多表关联的时候主要涉及inner join、left outer join、right outer join、full outer join这些关联写法。本文主要对stackoverflow:what-is-the-difference-between-inner-join-and-outer-join 的问题进行翻译,该问题主要解释了inner join 和 outer join之间的区别。本文在翻译的同时也对不能访问的链接或者回答本身进行了一些补充。

原问题:

INNER JOIN 、LEFT JOIN、RIGHT JOIN、FULL JOIN是如何进行关联的?

采纳答案:

我们用最常见的查询来说,也就是关联的列没有重复值:

  • inner join返回了A和B的交集,详情见维恩图: Venn diagram(维基百科内容,主要讲解了交集并集这些概念,打不开也不影响后续的理解)
  • outr join返回了A和B的并集,详情见维恩图: Venn diagram(维基百科内容,主要讲解了交集并集这些概念,打不开也不影响后续的理解)

示例:

假设有表A,其中有一列a,表B,其中有意列b,具体数据如下:

A    B
-    -
1    3
2    4
3    5
4    6

(1,2)只有A表中存在,(5,6)只有在B表存在,(3,4)A表和B表都存在。

Inner Join:

inner join等值查询的时候会返回两张表交集,即两张表的共同数据(3,4):

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Left Outer Join:

left outer join会返回A表的所有数据以及和B表共有的数据,如果B表不存在共有的数据则显示为NULL:

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

个人觉得left join通过并集来表示并不是特别严谨,包括下面的right join。当然通过集合的形式是有助于理解的,A表中数据全部展示,其中(1,2)在B表中不存在对应的数值显示NULL,(3,4)在B表中存在,一一对应显示。

Right Outer Join

right outer join会返回B表的所有数据以及A表共有的数据,如果A表不存在共有的数据则显示为NULL:

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

right outer join和left outer join的效果是一样,只是使用left outer join的时候是以左侧的表为准,显示左侧表的所有数据,right outer join的时候是以右侧的表为准,显示右侧表的所有数据。

Full Outer Join

full outer join会返回A表和B表所有的数据,如果数据在A表存在B表不存在则B表对应的列显示为NULL,如果数据在B表存在A表不存在则A表对应的列显示为NULL,A表和B表都存在数据成对进行展示。

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

具体的测试语句可以在dbfiddle中执行。

本文根据StackOverflow翻译而来,不代表烟海拾贝立场,如若转载,请注明出处:https://somirror.com/571.html

(0)
上一篇 2022-02-22 22:02
下一篇 2022-02-24 20:01

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注