Объяснение работы SQL JOIN на примере диаграмм Венна

Категории: Базы данных (mysql)

Использование синтаксиса SQL JOINS при работе с Базами данных достаточно популярно, без них не обходится любой серьезный SQL запрос. Я думал, что статья про SQL joins Ligaya Turmelle' великолепный примером для программистов-новчиков. Использование диаграмм Венна для объяснения их работы, вполне естественно и наглядно. Однако, комментируя ее статью, я обнаружил, что ее диаграммы Венна не вполне соответствовали синтаксису SQL join.

 

Я решил это разъяснить на примерах ниже. Предположим, что у нас есть две следующие таблицы. Слева Таблица A, и таблица B справа. Поместим в каждой из них по 4 записи (строки).

 

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

Давайте соединим эти таблицы с помощью SQL join по столбцу "name" несколькими способами и посмотрим как это будет выглядеть на диаграммах Венна.

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 (внутреннее присоединение) производит выбора только строк, которые есть и в таблице А и в таблице В.

 

Диаграмма венна для SQL inner 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

Full outer join (полное внешнее соединение - объединение ) производит выбор всех строк из таблица А и В, причем со всеми возможными варинтами. Если с какой-либо стороны не будет записи, то недостающая запись будет содежрать пустую строку (null значения).

Диаграмма Венна для SQL cartesian join

 

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 (левое внешнее соединение) производит выбор всех строк таблицы А с доступными строками таблицы В. Если строки таблицы В не найдены, то подставляется пустой результат (null).

 

Диаграмма Венна для SQL left join

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

Чтобы произвести выбор строк из Таблицы A, которых нет в Таблице Б, мы выполняем тот же самый LEFT OUTER JOIN, затем исключаем строки, которые заполнены в Таблице Б. То есть выбрать все записи таблицы А, которых нет в Таблице В, мы выполняем тоже jeft outer join, но исключаем пустые записи таблицы В.

join-left-outer.png

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

Чтобы выбрать уникальные записи таблиц А и В, мы выполняем FULL OUTER JOIN, и затем исключаем записи, которые принадлежат и таблице А, и таблице Б с помощью условия WHERE.

join-outer.png

Есть также декартовский соединение или CROSS JOIN, которое, насколько я могу сказать, не может быть выражено в диаграмме Венна:

SELECT * FROM TableA
CROSS JOIN TableB

Оно соединяет "все со всеми", в результате мы получаем 4*4 = 16 строк, что намного больше, чем в оригинальных таблицах. Это очень опасно для таблиц, содержащих большое количество данных. То есть получаются ВСЕ возможные комбинации, включая все Null-null строчки.

Источник: Перевод статьи "A Visual Explanation of SQL Joins" Джефа Атвуда

Ключевые слова: База данных, sql, join, диаграммы Венна, jeft join, outer join

Комментарии (7)

Добавить комментарий >>
galina 29 июля 2011 года 21:10:01 # комментировать
[url="http://spica.pro-net.in/"]Жизнь - это[/url] [url="http://klyuch.portall.in/"]очередь за [/url][url="http://znakomstva.socium.in/"]смертью, [/url][url="http://job.skwira.in/"]дурак тот кто[/url] [url="http://kontekst.ferexpro.in/"]лезет без[/url] [url="http://trud.pro-net.in/"]очереди.[/url]
Владимир 03 марта 2011 года 10:11:04 # комментировать
Спасибо за комментарии, поправил и кое-где дополнил текст.
Митрич 19 января 2011 года 14:44:48 # комментировать
Непанимайт) Рисовайт хаясо, гаварить плохой)
Владимир 26 ноября 2010 года 14:00:57 # комментировать
Спасибо за комментарии! это был черновой вариант, обязательно его откорректирую!
настя 23 ноября 2010 года 21:09:41 # комментировать
жесть полный улет огромное спосибо тебе а ошибочки исправь
Tonio 18 марта 2010 года 14:10:54 # комментировать
О, очень кстати! Спасибо) Хорошая статья, тока пара ошибочек есть ) пользуй проверку орфографии
Alex 13 июля 2010 года 00:56:37 # комментировать
Я плохо говорить по русски... :))))

Добавить комментарий


Share |