В чем разница между LEFT JOIN и RIGHT JOIN в SQL?

Ответ

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 вывело. Волнение ебать!