Какие основные виды JOIN существуют в SQL и чем они отличаются?

Ответ

Оператор JOIN в SQL используется для объединения строк из двух или более таблиц на основе связанного столбца. Основные виды отличаются логикой обработки совпадающих и несовпадающих строк.

Основные типы JOIN:

  1. INNER JOIN

    • Что делает: Возвращает только те строки, для которых условие соединения истинно в обеих таблицах.
    • Когда использовать: Когда нужны только данные, присутствующие в обеих связанных таблицах.
      SELECT *
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.id;
  2. LEFT (OUTER) JOIN

    • Что делает: Возвращает все строки из левой (первой) таблицы и совпадающие строки из правой. Если совпадения нет, для столбцов правой таблицы возвращается NULL.
    • Когда использовать: Когда нужно получить все записи из основной таблицы, даже если для них нет связанных данных в другой таблице.
      SELECT *
      FROM customers
      LEFT JOIN orders ON customers.id = orders.customer_id;
  3. RIGHT (OUTER) JOIN

    • Что делает: Обратная логика LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой.
    • Примечание: Используется реже, так как его функциональность обычно можно выразить через LEFT JOIN, поменяв таблицы местами.
  4. FULL (OUTER) JOIN

    • Что делает: Возвращает все строки из обеих таблиц. Совпадающие строки объединяются, а для несовпадающих с одной стороны заполняются NULL.
    • Когда использовать: Когда нужно увидеть полную картину из обеих таблиц, включая отсутствующие связи.
  5. CROSS JOIN

    • Что делает: Возвращает декартово произведение таблиц — каждую строку первой таблицы со всеми строками второй.
    • Когда использовать: Для генерации всех возможных комбинаций (например, для тестовых данных).
      -- Создаст комбинации всех размеров и всех цветов
      SELECT * FROM sizes CROSS JOIN colors;
  6. SELF JOIN

    • Что делает: Соединение таблицы с самой собой, как если бы это были две разные таблицы. Технически это обычный INNER или LEFT JOIN.
    • Когда использовать: Для работы с иерархическими данными (например, сотрудник -> менеджер) или сравнения строк внутри одной таблицы.
      SELECT e.name AS employee, m.name AS manager
      FROM employees e
      LEFT JOIN employees m ON e.manager_id = m.id;

Ключевое отличие: INNER JOIN работает с пересечением данных, а OUTER JOIN (LEFT, RIGHT, FULL) сохраняет строки из одной или обеих таблиц даже при отсутствии совпадений.

Ответ 18+ 🔞

Слушай, а давай про эти ваши JOIN'ы поговорим, а? Ну, чтобы, блядь, на пальцах, а не как эти заумные учебники, от которых мозг вскипает, как суп в кастрюле.

Представь себе, что у тебя есть две таблицы. Одна — это, допустим, список заказов, а вторая — список клиентов. И они как бы связаны, но не всегда, блядь, идеально. Вот JOIN'ы — это как раз способы их склеить, и от того, какой ты выберешь, зависит, какая картинка в итоге выйдет. Пиздец важная штука, если не хочешь потом огрести от начальства за неполный отчёт.

Основные разновидности этой хуйни:

  1. INNER JOIN (Внутреннее соединение)

    • Суть: Самый строгий, блядь, папа. Берёт две таблицы и выдаёт тебе только те строки, где есть полное, стопроцентное совпадение по условию в обеих таблицах. Всё остальное — нахуй, в топку. Не нашёл пару — прощай.
    • Когда юзать: Когда тебе нужны только полные данные. Например, все заказы, у которых точно есть клиент в базе. Хуй знает кто оформил — не интересует.
      SELECT *
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.id;
  2. LEFT JOIN (Левое соединение, оно же LEFT OUTER JOIN)

    • Суть: Вот это, блядь, часто самый нужный инструмент. Он говорит: «Окей, левая таблица у нас главная, святая корова. Все её строки мы берём полностью, нихуя не выбрасываем». А потом к каждой строке левой таблицы пытается прикрутить данные из правой. Нашёл совпадение — молодца, прикрутил. Не нашёл — ну и хуй с ним, поставил NULL в колонки из правой таблицы и пошёл дальше.
    • Когда юзать: Постоянно! Когда хочешь увидеть всех клиентов, даже тех, кто нихуя ещё не заказал. Или все товары, даже те, которые нихуя не продавались.
      SELECT *
      FROM customers
      LEFT JOIN orders ON customers.id = orders.customer_id;
  3. RIGHT JOIN (Правое соединение)

    • Суть: Полная противоположность LEFT JOIN. Тут святая корова — правая таблица. Но, если честно, ёпта, его почти никто не использует. Потому что чтобы получить тот же результат, можно просто таблицы местами поменять и сделать LEFT JOIN. Зачем мозги ломать? Чисто для академической, блядь, полноты картины.
  4. FULL OUTER JOIN (Полное внешнее соединение)

    • Суть: А вот это уже раздолбайский подход. Берёт всё из левой таблицы и всё из правой. Нашёл совпадения — склеил. Не нашёл совпадения слева — подставил NULL справа. Не нашёл справа — подставил NULL слева. В итоге получается полная, блядь, каша из всех возможных данных с обеих сторон.
    • Когда юзать: Когда нужно найти вообще все нестыковки. Кто есть в клиентах, но нет в заказах, и наоборот — кто есть в заказах, но клиент из базы пропал. Хитрая жопа, но иногда незаменимая.
  5. CROSS JOIN (Перекрёстное соединение)

    • Суть: Это когда ты, блядь, совсем ебнулся. Он просто берёт каждую строчку из первой таблицы и соединяет её с каждой строчкой из второй. Получается декартово произведение, овердохуища строк. Если в первой таблице 100 строк, а во второй 1000 — на выходе будет 100 000 строк. Пиздец и апокалипсис для сервера, если нечаянно.
    • Когда юзать: Осознанно и очень редко. Например, чтобы сгенерировать все комбинации размеров и цветов для товара.
      -- Получим ВСЕ варианты: S, M, L в красном, синем, зелёном...
      SELECT * FROM sizes CROSS JOIN colors;
  6. SELF JOIN (Самосоединение)

    • Суть: Ну тут прикол в том, что таблица соединяется сама с собой. Представь список сотрудников, где у каждого есть поле manager_id — айдишник его начальника, который тоже записан в этой же таблице. Чтобы вывести имя сотрудника и имя его босса, нужно эту таблицу как бы скопировать в уме и соединить.
    • Когда юзать: Для иерархий (дерево подчинённых) или чтобы сравнить строки внутри одной таблицы между собой.
      -- e — это псевдоним для таблицы сотрудников, m — псевдоним для той же таблицы, но как бы «менеджеров»
      SELECT e.name AS employee, m.name AS manager
      FROM employees e
      LEFT JOIN employees m ON e.manager_id = m.id;

Итог, блядь, простой: INNER JOIN — это пересечение, только общее. LEFT JOIN — «главная левая таблица и что удалось прицепить справа». FULL JOIN — «а давайте возьмём всё, что есть, и посмотрим, что получится, в рот меня чих-пых». Выбирай по смыслу задачи, а не тыкай наугад.