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

«Какие типы операций JOIN вы знаете в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Операция 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.