В первую очередь шпаргалка для себя, но надеюсь кому нибудь окажется полезным.
Для начала оговорим, что у нас есть две таблицы: Table A и Table B:
id name id name
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
Теперь можно рассмотреть, варианты и различия возможных JOIN запросов.
Inner join выведет записи, которые соответствуют таблице A и таблице B.
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.nameid name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
Full outer join выведет все записи из Таблицы A и Таблицы B, сопоставив данные из обеих таблиц, если в одной из таблиц данные отсутсвуют, то результатом для данной ячейки будет "NULL"
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.nameid name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader
Left outer join выведет данные из Таблицы A, с сопутсвующими данными из Таблицы B. Если подходящих данных в Таблице B нету, то будет выбран "NULL"
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.nameid name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
Оперируя прошлым примером, нам не составит труда достать только те данные, которые есть в Таблице A, для этого нужно использовть left outer join, с исключением пустых записей из Таблицы B
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS nullid name id name
2 Monkey null null
4 Spaghetti null null
А если, чуть чуть усложнить задачу, то мы лего достанем данные, которые не имеют ничего общего. Для этого нужно использовать full outer join.
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader
Вот собственно и всё. Всё просто.
P.s. Данная статья является вольным переводом некой статьи, авторство которой мне не известно.