MySQL: Join, Left Join, Right Join или «Джоины простыми словами»

Сегодня я решил поведать Вам о языке запросов MySQL, а точнее о конструкции JOIN, которая, как правило, и вызывает недопонимание о начинающих разработчиков…
На самом деле в данных командах нет ничего сложного. Давайте рассмотрим их на примере. Двух простых таблиц.

Таблица 1 (groups)

Id Name
1 Гость
2 Администратор
3 Зарегистрированный

Таблица 2 (users)

Id Login Group
1 Admin 2
2 Vasa 3
2 Petya 4

Запросы вида таблица1 JOIN таблица2 — являются декартовым произведением строк из указанных таблиц. Если вы не знаете или не помните что такое декартово произведение, то напомню — это ничто иное объедение всех элементов одного множества, с элементами другого множества. Т.е. запрос вида

SELECT * FROM users JOIN groups

Вернет нам 3*3=9 строк (каждой строке из таблицы users будет сопоставлена строка из таблица groups).
В результате мы увидим нечто похожее на:

Id Login Group Id Name
1 Admin 2 1 Гость
1 Admin 2 2 Администратор
1 Admin 2 3 Зарегистрированный
2 Vasa 3 1 Гость
и т.д.

Однако такие «полные» джоины редкость. Обычно запрос Join сопровождается правилом стыковки строк из двух таблиц. В нашем случае в таблице users колонка Group является вторичным ключем на поле Id в таблицы groups. Таким образом правильный запрос для нашего случая будет выглядеть так:

SELECT u.*, g.Name FROM users u JOIN groups g ON u.Group = g.Id

Результат запроса:

Id Login Group Name
1 Admin 2 Администратор
2 Vasa 3 Зарегистрированный

Как мы видим. В выборку не попал пользователь с логином Petya. Объясняется это тем, что данный пользователь имеет группу 4, в то время как в таблице group записи с таким Id не существует. В результате этого Вы можете «потерять» некоторые свои данные при работе с JOIN.

Соответственно возникает вопрос, а как же получить всех пользователей и их группы? Ответ прост, именно для таких случаев и реализованы запросы LEFT JOIN, RIGHT JOIN. Логика работы данных запросов одинакова, но они зависимы от расположения имен таблиц слева и справа от них (в запросе JOIN такой зависимости нет).

Что же делает LEFT JOIN? Данный запрос берет все строчки из таблицы, написанной слева от данной конструкции и приписывает к ней соответствующие строчки из таблицы, приписанной справа от данной конструкции. При этом, если соответствующая строчка в правой таблице не найдена (например как для юзера Petya), то припишутся NULL столбцы.

SELECT u.*, g.Name FROM users u LEFT JOIN groups g ON u.Group = g.Id

Результат запроса:

Id Login Grpup Name
1 Admin 2 Администратор
2 Vasa 3 Зарегистрированный
3 Petya 4 NULL

RIGHT JOIN работает абсолютно аналогично как и LEFT JOIN, только берутся все строчки из таблицы, стоящей справа от этой конструкции. Таким образом чтобы получить RIGHT JOIN с использованием LEFT JOIN достаточно лишь поменять положение таблиц относительно данной конструкции, например, описанные ниже запросы идентичны:

SELECT * FROM table1 LEFT JOIN table2;
SELECT * FROM table2 RIGHT JOIN table1;
Запись опубликована в рубрике MySQL, Проще говоря с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.