Сегодня я решил поведать Вам о языке запросов 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;