Какие типы операций JOIN вы знаете в SQL?

Ответ

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

Основные JOIN-операции

  1. INNER JOIN

    • Возвращает только те строки, для которых условие соединения (ON) истинно в обеих таблицах.
    • Это самый распространённый тип JOIN.
      SELECT a.*, b.*
      FROM Orders a
      INNER JOIN Customers b ON a.CustomerId = b.Id;
      -- Результат: только заказы, у которых есть клиент.
  2. LEFT (OUTER) JOIN

    • Возвращает все строки из левой (первой) таблицы и совпадающие строки из правой. Если совпадения нет, для столбцов правой таблицы возвращается NULL.
      SELECT a.*, b.*
      FROM Customers a
      LEFT JOIN Orders b ON a.Id = b.CustomerId;
      -- Результат: все клиенты, даже те, у которых нет заказов.
  3. RIGHT (OUTER) JOIN

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

    • Возвращает все строки из обеих таблиц. Если совпадение есть, строки объединяются. Если совпадения для строки из левой таблицы нет, столбцы правой будут NULL, и наоборот.
      SELECT a.*, b.*
      FROM TableA a
      FULL OUTER JOIN TableB b ON a.Key = b.Key;
      -- Результат: все записи из A и B.

Специальные JOIN-операции

  1. CROSS JOIN

    • Возвращает декартово произведение таблиц: каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать очень большие результирующие наборы.
      SELECT a.*, b.* FROM Colors a CROSS JOIN Sizes b;
      -- Результат: все комбинации цветов и размеров.
  2. SELF JOIN

    • Соединение таблицы самой с собой. Полезно для работы с иерархическими данными (например, таблица сотрудников с полем ManagerId).
      SELECT emp.Name AS Employee, mgr.Name AS Manager
      FROM Employees emp
      LEFT JOIN Employees mgr ON emp.ManagerId = mgr.Id;

Ключевое отличие INNER от OUTER JOIN: INNER фильтрует результат по совпадению, OUTER сохраняет все строки из одной или обеих таблиц, заполняя пропуски NULL.

Ответ 18+ 🔞

Давай разберем эти ваши JOIN'ы, а то смотрю, народ путается, как слепой кот в сортире.

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

Основные склейки, без которых нихуя не работает

  1. INNER JOIN (Внутреннее соединение) Это как строгий бухгалтер. Берёт только те записи, где есть полное совпадение в обеих таблицах. Нет совпадения — нахуй такие строки, в результат не попадают.

    SELECT a.*, b.*
    FROM Orders a
    INNER JOIN Customers b ON a.CustomerId = b.Id;
    -- Тут ты получишь ТОЛЬКО заказы, у которых в таблице клиентов есть родитель. Бездомные заказы, у которых CustomerId ведёт в пустоту, просто исчезнут, как твоя зарплата в конце месяца.
  2. LEFT JOIN (Левое соединение) А вот это уже поинтереснее. Он возвращает ВСЁ из левой таблицы (той, что в FROM). А из правой — только то, что подошло. Не подошло? Ну и хуй с ним, будет NULL.

    SELECT a.*, b.*
    FROM Customers a
    LEFT JOIN Orders b ON a.Id = b.CustomerId;
    -- Здесь ты увидишь ВСЕХ клиентов, даже тех лодырей, которые нихуя не купили. У них в полях заказа будет красивый NULL. Удобно для отчётов "кто у нас вообще есть и кто из них хоть что-то делает".
  3. RIGHT JOIN (Правое соединение) Это тот же левый JOIN, только наоборот. Всё из правой таблицы, плюс что смогли найти в левой. Честно говоря, его нихуя не используют, потому что можно просто таблицы местами поменять и сделать LEFT JOIN — и все сразу поймут, что ты имел в виду.

  4. FULL OUTER JOIN (Полное внешнее соединение) Это уже полный разгул демократии. "Хочу всё и сразу!" Берёт все записи из обеих таблиц. Нашёл совпадение — молодца, склеил. Не нашёл слева — оставил правую запись, а слева NULL. Не нашёл справа — оставил левую, справа NULL.

    SELECT a.*, b.*
    FROM TableA a
    FULL OUTER JOIN TableB b ON a.Key = b.Key;
    -- Полная картина, все на свете связи и их отсутствие. Полезно, когда ищешь расхождения: "а что у нас есть в А, но нет в Б, и наоборот?".

Специальные приёмы для извращенцев

  1. CROSS JOIN (Перекрёстное соединение) О, это мощная штука, с ней надо аккуратнее, чем с гранатой. Она делает декартово произведение. Проще говоря, каждую строку из первой таблицы приклеивает к КАЖДОЙ строке из второй. Таблица на 100 строк и таблица на 100 строк дадут тебе 10 тысяч строк результата. Можешь сервер положить, если не думаешь.

    SELECT a.*, b.* FROM Colors a CROSS JOIN Sizes b;
    -- Классика: получишь все комбинации цветов и размеров. "Красный XL", "Красный L", "Синий XL" и так далее, пока не кончатся варианты.
  2. SELF JOIN (Самосоединение) Это когда таблица такая классная, что её можно склеить саму с собой. Представь таблицу сотрудников, где у каждого есть поле ManagerId — айдишник его начальника, который тоже записан в этой же таблице. Как найти имя начальника для каждого?

    SELECT emp.Name AS Employee, mgr.Name AS Manager
    FROM Employees emp
    LEFT JOIN Employees mgr ON emp.ManagerId = mgr.Id;
    -- Берём таблицу Employees как бы два раза: один раз как "сотрудники" (emp), второй раз как "менеджеры" (mgr). И связываем айдишник менеджера у сотрудника с основным айдишником в той же таблице, но в роли менеджера. Голова может сломаться, но когда врубишься — красота.

Так в чём, блядь, главная разница между INNER и OUTER? Да всё просто, как три копейки. INNER JOIN — это "только совпадения, остальное нахуй". OUTER JOIN (LEFT, RIGHT, FULL) — это "дайте мне всё из одной или обеих таблиц, а на отсутствие совпадений я посрать, отмечу NULL'ом и жить буду".

Вот и вся магия. Главное — не перепутать, когда тебе нужны все клиенты, а когда только те, кто что-то купил. А то получишь от начальства по шапке, ебать колотить.