Ответ
LEFT JOIN и RIGHT JOIN — это типы внешних соединений (OUTER JOIN), которые возвращают все строки из одной таблицы и сопоставленные строки из другой. Разница — в том, какая таблица считается главной (все строки обязательны).
LEFT JOIN
Возвращает все записи из левой (первой) таблицы, даже если для них нет совпадений в правой таблице. Для несовпадающих строк поля из правой таблицы будут NULL.
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- Результат: ВСЕ сотрудники, даже те, кто не привязан к отделу.
RIGHT JOIN
Возвращает все записи из правой (второй) таблицы, даже если для них нет совпадений в левой таблице. Для несовпадающих строк поля из левой таблицы будут NULL.
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
-- Результат: ВСЕ отделы, даже те, в которых нет сотрудников.
Практическое правило:
LEFT JOINиспользуется значительно чаще.- Любой
RIGHT JOINможно переписать какLEFT JOIN, просто поменяв таблицы местами в запросе. Это делает код более единообразным и легким для чтения.
Визуализация:
Таблица A LEFT JOIN A-B RIGHT JOIN A-B (эквивалентно LEFT JOIN B-A)
[1, 2, 3] JOIN [1, 2, 3, NULL] VS [NULL, 2, 3, 4]
Таблица B [a, b, c, NULL] [NULL, b, c, d]
[a, b, c, d] Ответ 18+ 🔞
Ага, вот эта тема с левыми и правыми джойнами! Сидишь такой, пишешь запрос, а потом — бац! — и понимаешь, что нихуя не понимаешь, кто откуда что возвращает. Ёпта, давай разберём, как есть.
LEFT JOIN — это как будто ты взял левую таблицу и сказал: «Ты, сука, главная! Все твои строки мне выведи, даже если они там с правой таблицей нихуя не совпали». А если не совпали — ну и хуй с ним, справа будут NULL висеть, как сопли.
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- Вот тут выведутся ВСЕ работнички, даже те, кто сидит в отделе «Пиздец и точка»,
-- которого в справочнике отделов вообще нет. Просто вместо отдела будет NULL.
А RIGHT JOIN — это та же самая хуйня, только наоборот. Тут уже правая таблица орёт: «Я тут главная, блядь! Все мои записи покажи, даже если слева нихуя нет!». И слева тогда NULL будут.
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
-- А вот тут уже покажут ВСЕ отделы, даже те, в которых нихуя сотрудников нет.
-- Типа отдел «Секретная лаборатория», а там один директор на три стула.
Но вот практическая фишка, ёбана:
RIGHT JOIN — это как левша, который пытается писать правой рукой. Можно, но зачем? Любой RIGHT JOIN можно на раз перевернуть в LEFT JOIN, просто таблицы местами поменять. И все сразу станет понятнее, потому что LEFT JOIN все используют, а RIGHT JOIN — так, мартышлюшка какая-то, чтоб мозг ебать.
Короче, смотри как это выглядит:
Таблица A (сотрудники): [Вася, Петя, Гриша]
Таблица B (отделы): [IT, Бухгалтерия]
LEFT JOIN A-B: [Вася-IT, Петя-Бухгалтерия, Гриша-NULL] // Гриша без отдела, но он есть!
RIGHT JOIN A-B: [NULL-IT, Вася-IT, Петя-Бухгалтерия] // Отдел IT есть, а сотрудника нет? Странно, но ок.
Вот и вся магия. Главное — не запутаться, какая таблица у тебя «главная», а какая — «прицеп». А то получится как в том анекдоте: присоединил не туда — и вместо зарплаты NULL вывело. Волнение ебать!