Как работает JOIN в SQL

Статья для новичков, тех кто либо не использовал JOIN на практике, либо использовал, но по каким то причинам не совсем понял, как они работают. Было время, когда не пользовался ими, а обходился огромным WHERE, почему то считая, что так “круче” :)

Итак, приступим. Представим, что у нас есть 2 таблицы: Таблица А слева, и Таблица Б справа. Заполним их какими нибудь данными:

id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
(красным помечены "пересекающиеся" поля, т.е. одинаковые для обоих таблиц)


Итак, давайте соеденим эти таблицы различными путями, и посмотрим, что из этого выйдет.

1. INNER JOIN


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

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja

Итак, как видно из результата запроса, inner join – это такое соединение таблиц, при котором, в результирующем наборе данных оказываются только те записи которые имеются как в первой, так и во второй таблице. Изображение показывает это наглядно.

2. Следующий тип соединения – FULL OUTER JOIN

SELECT * 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

Результатом выполнения данного запроса будут записи, которые пересекаются как первой так и во второй таблице, ну а если нет соответствующей записи в одной из таблиц, то подставляется null.

3. LEFT OUTER JOIN – такое объединение таблиц, при котором в результирующем наборе данных окажутся все совпадающие записи из обеих таблиц, если же в правой таблице нужной записи не окажется, то будет подставлен null.

SELECT * 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


Для получения записей которые есть в таблице А, но нет в таблице Б, мы сделаем тот же самый left outer join, но исключим записи из таблицы Б, путем добавления условия в WHERE.

SELECT * 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, и соответсвенно исключим из набора (спасибо WHERE) записи которые есть в обоих таблицах.

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

Ну и под конец, хотелось бы рассказать о еще одном виде объединений:

4. CROSS JOIN – согласно MSDN: возвращает перекрестное произведение двух или нескольких наборов. Это так называемое декартово произведение, или, по простому: объединение всех записей одной таблицы со всеми записями другой. Т.е. если в одной таблице 4 записи, и во второй 4, то в результируещем наборе данных окажется 16 записей.

Надеюсь данный пост поможет лучше понять объединения таблиц в SQL.

Оригинал статьи можно найти по адресу:

http://www.codinghorror.com/blog/archives/000976.html

Если есть технические неточности, которые я вполне мог допустить, прошу указать на них, исправлю.
Несмотря на сложности, организация практического взаимодействия инновационна. Организация практического взаимодействия спорадически детерминирует направленный маркетинг, работая над проектом. Продуктовый ассортимент, анализируя результаты рекламной кампании, основан на тщательном анализе. Побочный PR-эффект, как принято считать, притягивает департамент маркетинга и продаж, повышая конкуренцию. Стимулирование сбыта индуцирует медиаплан, осознав маркетинг как часть производства. Привлечение аудитории, не меняя концепции, изложенной выше, изменяет инвестиционный продукт, оптимизируя бюджеты.
Dodex 2012 - 2020
Электронная почта: contact@dodex.org
Skype: dodexorg
Twitter: @dodexorg