Давно хотел понять для себя смысл и принцип работы JOIN. Особо с ними не работал, так как весь необходимый функционал работы с БД при создании сайтов на MODx у меня всегда был под рукой в виде API. А в те несколько случаев необходимости использования JOIN я обошолся LEFT JOIN‘ом, а дальше лишнее обрабатывал уже в PHP. Знаю, это совсем неправильно, однако оно работало и мне было этого достаточно.
Сейчас я решил улучшить свои знания MySQL. Почитал литературу, узнал много о типах БД, о настройке и т.п. Теперь пришло время разобраться с JOIN. Я нашел статью по теме, которая наглядно показывает что из себя представляет результат работы JOIN. Представляю вашему вниманию вольный ее перевод (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html).
Итак, мы имеем 2 таблицы.
1 2 3 4 5 6 |
id name id name -- ---- -- ---- 1 Вася 1 Виталий 2 Алексей 2 Вася 3 Гена 3 Никита 4 Александр 4 Гена |
Далее, для этих таблиц мы рассмотрим несколько видов JOIN и увидим представление их результатов в виде диаграмм Эйлера-Венна.
1. INNER JOIN
SQL:
1 2 3 |
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name |
Представление в виде таблиц:
1 2 3 4 |
id name id name -- ---- -- ---- 1 Вася 2 Вася 3 Гена 4 Гена |
Пояснение результата с помощью диаграмм Эйлера-Венна:

INNER JOIN — диаграмма Эйлера — Венна
Пояснение словами:
Результатом объединения таблиц с помощью INNER JOIN являются записи, общие для левой и правой таблиц.
2. FULL OUTER JOIN
SQL:
1 2 3 |
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name |
Представление в виде таблиц:
1 2 3 4 5 6 7 8 |
id name id name -- ---- -- ---- 1 Вася 2 Вася 2 Алексей null null 3 Гена 4 Гена 4 Александр null null null null 1 Виталий null null 3 Никита |
Пояснение результата с помощью диаграмм Эйлера-Венна:

FULL OUTER JOIN — диаграмма Эйлера — Венна
Пояснение словами:
Результатом объединения таблиц с помощью FULL OUTER JOIN являются все записи, которые присутствуют в каждой из таблиц.
3. LEFT OUTER JOIN
SQL:
1 2 3 |
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name |
Представление в виде таблиц:
1 2 3 4 5 6 |
id name id name -- ---- -- ---- 1 Вася 2 Вася 2 Алексей null null 3 Гена 4 Гена 4 Александр null null |
Пояснение результата с помощью диаграмм Эйлера-Венна:

LEFT OUTER JOIN — диаграмма Эйлера — Венна
4. LEFT OUTER JOIN за исключением записей, которые присутствую в правой таблице
SQL:
1 2 3 4 |
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null |
Представление в виде таблиц:
1 2 3 4 |
id name id name -- ---- -- ---- 2 Алексей null null 4 Александр null null |
Пояснение результата с помощью диаграмм Эйлера-Венна:

LEFT OUTER JOIN без записей из правой таблицы — диаграмма Эйлера — Венна
5. FULL OUTER JOIN за исключением записей, которые присутствуют в обоих таблицах
SQL:
1 2 3 4 5 |
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null |
Представление в виде таблиц:
1 2 3 4 5 6 |
id name id name -- ---- -- ---- 2 Алексей null null 4 Александр null null null null 1 Виталий null null 3 Никита |
Пояснение результата с помощью диаграмм Эйлера-Венна:

FULL OUTER JOIN без записей, общих для двух таблиц — диаграмма Эйлера — Венна
Как мы видим, диаграммы наглядно показывают смысл объединения таблиц различными способами. Надеюсь данный материал будет вам полезен в разработке.
Спонсор поста:
Хотите знать когда ваш сайт был оффлайн? Используйте мониторинг сайтов и будете знать что происходило с вашим сайтом.
Pingback: SQL JOIN cheat sheet()