Давно хотел понять для себя смысл и принцип работы 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:MySQL
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 являются записи, общие для левой и правой таблиц.
2. FULL OUTER JOIN
SQL: MySQL
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 являются все записи, которые присутствуют в каждой из таблиц.
3. LEFT OUTER JOIN
SQL: MySQL
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
|
Пояснение результата с помощью диаграмм Эйлера-Венна:
4. LEFT OUTER JOIN за исключением записей, которые присутствую в правой таблице
SQL: MySQL
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
|
Пояснение результата с помощью диаграмм Эйлера-Венна:
5. FULL OUTER JOIN за исключением записей, которые присутствуют в обоих таблицах
SQL: MySQL
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 Никита
|
Пояснение результата с помощью диаграмм Эйлера-Венна:
Как мы видим, диаграммы наглядно показывают смысл объединения таблиц различными способами. Надеюсь данный материал будет вам полезен в разработке.