Архив

SQL Joins Виды, типы, различия.

В первую очередь шпаргалка для себя, но надеюсь кому нибудь окажется полезным.

Для начала оговорим, что у нас есть две таблицы: 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.

join-inner

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id name id name


1 Pirate 2 Pirate
3 Ninja 4 Ninja

Full outer join выведет все записи из Таблицы A и Таблицы B,  сопоставив данные из обеих таблиц, если в одной из таблиц данные отсутсвуют, то результатом для данной ячейки будет "NULL"

join-cartesianSELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id 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"

join-leftSELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id name id name


1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

Оперируя прошлым примером, нам не составит труда достать только те данные, которые есть в Таблице A, для этого нужно использовть left outer join, с исключением пустых записей из Таблицы B

join-left-outerSELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id name id name


2 Monkey null null
4 Spaghetti null null

А если, чуть чуть усложнить задачу, то мы лего достанем данные, которые не имеют ничего общего. Для этого нужно использовать full outer join.

join-outerSELECT * 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. Данная статья является вольным переводом некой статьи, авторство которой мне не известно.