# A Visual Explanation of SQL Joins

**URL:** <https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455>\
**Category:** blog\
**Created:** [October 11, 2007, 12:00am UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455 "2007-10-11T00:00:00Z")\
**Posts on this page:** 9\
**Page:** 9

<div class="post-metadata">

**Author:** ![Bluevertro](https://discourse-cdn.codinghorror.com/letter_avatar_proxy/v2/letter/b/c2a13f/32.png) [@Bluevertro](https://discourse.codinghorror.com/u/Bluevertro)\
**Post date:** [February 4, 2018, 8:01pm UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/204 "2018-02-04T20:01:16Z")

</div>

![image](https://discourse-cdn.codinghorror.com/uploads/default/original/3X/6/4/644911e6d87235bd6fc963bc40bc31c78fe84e2d.png)

Where ‘possible table contents’ is the cross product given A and B.

Cross product gives us everything _outside_ the diagram as well as what is inside. …Within the scope of possible results that is. This is all in a bigger circle. As far as I can see, the model holds. And if it doesn’t? Then we just need another circle to contain the instances where it fails. 😉

---

<div class="post-metadata">

**Author:** ![wickidd](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/wickidd/32/75191_2.png) [@wickidd](https://discourse.codinghorror.com/u/wickidd)\
**Post date:** [March 29, 2018, 2:53pm UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/205 "2018-03-29T14:53:38Z")

</div>

@codinghorror your work has been replicated in es6 🙂

> <https://stackoverflow.com/questions/1187518/how-to-get-the-difference-between-two-arrays-in-javascript/33034768#33034768>

BTW, I can’t count the number of times I’ve referred back to this page over the years. Thanks.

---

<div class="post-metadata">

**Author:** ![turicas](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/turicas/32/75580_2.png) [@turicas](https://discourse.codinghorror.com/u/turicas)\
**Post date:** [September 4, 2018, 6:32am UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/206 "2018-09-04T06:32:28Z")

</div>

Good post, very clear!  
Note: the image for inner join is returning 404.

---

<div class="post-metadata">

**Author:** ![codinghorror](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/codinghorror/32/36371_2.png) [@codinghorror](https://discourse.codinghorror.com/u/codinghorror)\
**Post date:** [September 10, 2018, 3:10am UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/207 "2018-09-10T03:10:02Z")

</div>

It’s a Ghost Pro hosting issue… their CDN isn’t returning the image. I’ve written them about it.

---

<div class="post-metadata">

**Author:** ![adibtatriantama](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/adibtatriantama/32/76092_2.png) [@adibtatriantama](https://discourse.codinghorror.com/u/adibtatriantama)\
**Post date:** [August 7, 2019, 9:03am UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/209 "2019-08-07T09:03:42Z")

</div>

Helped me a LOT !!  
Thank you for sharing 😄😄

---

<div class="post-metadata">

**Author:** ![ewanog](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/ewanog/32/77218_2.png) [@ewanog](https://discourse.codinghorror.com/u/ewanog)\
**Post date:** [March 31, 2021, 9:12pm UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/210 "2021-03-31T21:12:22Z")

</div>

I think this has been in my bookmarks for about 6-7 years now and it’s where I go everytime I need my memory jogged

---

<div class="post-metadata">

**Author:** ![JimPas](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/jimpas/32/76163_2.png) [@JimPas](https://discourse.codinghorror.com/u/JimPas)\
**Post date:** [April 2, 2021, 10:19pm UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/211 "2021-04-02T22:19:12Z")

</div>

Welcome to the community, Ewan! Everyone’s memory needs to be jogged every once in a while. That’s why I’ve been reading the _old_ topics for some time. I even get a few good laughs from some of the remarks. Refreshing in more than one way. 😃

---

<div class="post-metadata">

**Author:** ![codinghorror](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/codinghorror/32/36371_2.png) [@codinghorror](https://discourse.codinghorror.com/u/codinghorror)\
**Post date:** [January 7, 2025, 6:39am UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/212 "2025-01-07T06:39:04Z")

</div>



---

<div class="post-metadata">

**Author:** ![JimPas](https://discourse-cdn.codinghorror.com/user_avatar/discourse.codinghorror.com/jimpas/32/76163_2.png) [@JimPas](https://discourse.codinghorror.com/u/JimPas)\
**Post date:** [May 4, 2025, 7:39pm UTC](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455/213 "2025-05-04T19:39:44Z")

</div>



[Previous page](https://discourse.codinghorror.com/t/a-visual-explanation-of-sql-joins/455.md?page=8)
