LEFT JOIN = (cross join w/where) UNION (non-matching || nulls from LEFT) RIGHT JOIN = (cross join w/where) UNION (non-matching || nulls from RIGHT) FULL JOIN = (LEFT JOIN) UNION ALL (RIGHT JOIN)
| 1 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 |
| 4 | Column 1 | Column 2 | Column 3 |
| 5 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 | 1 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 | 2 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 | 3 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 | 4 | Column 1 | Column 2 | Column 3 |
| 1 | Column 1 | Column 2 | Column 3 | 5 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 | 1 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 | 2 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 | 3 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 | 4 | Column 1 | Column 2 | Column 3 |
| 2 | Column 1 | Column 2 | Column 3 | 5 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 | 1 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 | 2 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 | 3 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 | 4 | Column 1 | Column 2 | Column 3 |
| 3 | Column 1 | Column 2 | Column 3 | 5 | Column 1 | Column 2 | Column 3 |
| Join Type | ON? | WHERE? |
| CROSS JOIN | Must Not Have | Optional |
| INNER JOIN | Required | Optional |
| LEFT JOIN | Required | Optional |
| RIGHT JOIN | Required | Optional |
A1 B1
A2 B2
A3 B2E
---------------
CROSS JOIN
A1 B1
A1 B2
A1 B2E
A2 B1
A2 B2
A2 B2E
A3 B1
A3 B2
A3 B2E
---------------
INNER JOIN = CROSS JOIN + condition:
met -> keep entire row
not met -> drop entire row
A1 B1
A2 B2
A2 B2E
------------------
LEFT JOIN = CROSS JOIN + condition:
met -> keep entire row
not met -> keep distinct left
A1 B1
A2 B2
A2 B2E
A3 []
-------------------