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

«Какие основные виды JOIN существуют в SQL и чем они отличаются?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор 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) сохраняет строки из одной или обеих таблиц даже при отсутствии совпадений.