# What is the difference between “INNER JOIN” and “OUTER JOIN”?

Also, how do `LEFT OUTER JOIN``RIGHT OUTER JOIN`, and `FULL OUTER JOIN` fit in?

• 22@DanteTheSmith No, that suffers from the same problems as the diagrams here. See my comment above re the question & below re that very blog post: “Jeff repudiates his blog a few pages down in the comments”. Venn diagrams show elements in sets. Just try to identify exactly what the sets are and what the elements are in these diagrams. The sets aren’t the tables and the elements aren’t their rows. Also any two tables can be joined, so PKs & FKs are irrelvant. All bogus. You are doing just what thousands of others have done–got a vague impression you (wrongly) assume makes sense. – philipxy May 18, 2017 at 5:57
• 2My preceding comment is about a confused repudiated Jeff Atwood blog post. – philipxy Jan 23, 2021 at 23:15
• 2My 1st comment’s link is external, but i.stack.imgur.com has permanent copies of its illustrations of output (not input) for innerleft & full joins (in green). – philipxy Feb 27, 2021 at 4:37

Assuming you’re joining on columns with no duplicates, which is a very common case:

• An inner join of A and B gives the result of A intersect B, i.e. the inner part of a Venn diagram intersection.
• An outer join of A and B gives the results of A union B, i.e. the outer parts of a Venn diagram union.

Examples

Suppose you have two tables, with a single column each, and data as follows:

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

Note that (1,2) are unique to A, (3,4) are common, and (5,6) are unique to B.

Inner join

An inner join using either of the equivalent queries gives the intersection of the two tables, i.e. the two rows they have in common.

``````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

A left outer join will give all rows in A, plus any common rows in B.

``````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
``````

Right outer join

A right outer join will give all rows in B, plus any common rows in A.

``````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
``````

Full outer join

A full outer join will give you the union of A and B, i.e. all the rows in A and all the rows in B. If something in A doesn’t have a corresponding datum in B, then the B portion is null, and vice versa.

``````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``````

Share