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

Ответ

Эти операции объединения (JOIN) определяют, какие строки из соединяемых таблиц попадут в результирующий набор.

Типы JOIN (на примере таблиц Customers и Orders)

  1. INNER JOIN

    • Возвращает только те записи, для которых условие соединения (ON) выполняется в обеих таблицах.
    • Записи без соответствия отбрасываются.
      -- Только клиенты, у которых есть заказы
      SELECT *
      FROM Customers c
      INNER JOIN Orders o ON c.id = o.customer_id;
  2. LEFT (OUTER) JOIN

    • Возвращает ВСЕ записи из левой таблицы (Customers).
    • Для записей, у которых нет соответствия в правой таблице, поля из правой таблицы будут NULL.
      -- Все клиенты, даже если у них нет заказов
      SELECT *
      FROM Customers c
      LEFT JOIN Orders o ON c.id = o.customer_id;
  3. RIGHT (OUTER) JOIN

    • Возвращает ВСЕ записи из правой таблицы (Orders).
    • Для записей, у которых нет соответствия в левой таблице, поля из левой таблицы будут NULL.
    • На практике используется реже, так как его всегда можно заменить на LEFT JOIN, поменяв таблицы местами.
      -- Все заказы, даже если для них нет записи о клиенте (аналог LEFT JOIN с переставленными таблицами)
      SELECT *
      FROM Customers c
      RIGHT JOIN Orders o ON c.id = o.customer_id;

Визуализация

Часто используется мнемоника на основе диаграмм Венна или следующее правило:

  • INNER JOIN = пересечение множеств.
  • LEFT JOIN = всё левое множество + пересечение.
  • RIGHT JOIN = всё правое множество + пересечение.

Ответ 18+ 🔞

Давай разберём эту хуйню с джойнами, а то народ путается, как слепой кот в сортире. Представь, что у тебя есть две таблицы: Customers (клиенты) и Orders (заказы). И нам надо их скрестить, как удава с хомяком.

Так, блядь, какие бывают скрещивания (JOIN)

  1. INNER JOIN (Внутреннее скрещивание)

    • Самый жадный, блядь. Берёт только то, что есть в обеих таблицах. Если у клиента нет заказа или заказ без клиента — нахуй такие записи, в помойку.
    • Только взаимная любовь, никаких свободных отношений.
      -- Дашь мне только тех клиентов, которые уже что-то купили? Остальные — лохи.
      SELECT *
      FROM Customers c
      INNER JOIN Orders o ON c.id = o.customer_id;
  2. LEFT (OUTER) JOIN (Левое внешнее скрещивание)

    • Вот это уже интереснее. Берём ВСЕХ клиентов, абсолютно всех, даже тех, кто только пришёл и нихуя не купил.
    • Если заказа у клиента нет — поля из таблицы заказов будут просто NULL. Типа, пусто, нихуя.
      -- Покажи мне всех клиентов, даже самых нищебродских! А заказы ихние — если есть.
      SELECT *
      FROM Customers c
      LEFT JOIN Orders o ON c.id = o.customer_id;
  3. RIGHT (OUTER) JOIN (Правое внешнее скрещивание)

    • Зеркальный уродец. Берёт ВСЕ заказы, даже те, которые, блядь, с небес упали, и к ним клиент не приписан.
    • Если клиента для заказа нет — поля из таблицы клиентов будут NULL.
    • Честно? Им почти не пользуются, ёпта. Потому что можно просто таблицы местами поменять и сделать LEFT JOIN — и мозг не ебёт.
      -- Все заказы на свете, даже анонимные! (Но то же самое — LEFT JOIN, если таблицы переставить)
      SELECT *
      FROM Customers c
      RIGHT JOIN Orders o ON c.id = o.customer_id;

Как это запомнить, не сойдя с ума

Представь два круга, которые пересекаются, как сиськи в тесном лифчике.

  • INNER JOIN — тебе только та самая область пересечения, где они соприкасаются. Всё остальное — неинтересно.
  • LEFT JOIN — тебе весь левый круг (клиенты) целиком, и кусочек правого (заказы), который к нему прилип.
  • RIGHT JOIN — то же самое, но наоборот: весь правый круг и прилипший кусок левого.

Вот и вся магия, блядь. Главное — не перепутай, а то получишь хуйню вместо отчёта.