Какие виды JOIN в SQL вы знаете?

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

Ответ

При тестировании, особенно при проверке отчётов или сложной бизнес-логики, часто приходится анализировать или составлять SQL-запросы с JOIN. Основные типы:

  1. INNER JOIN (или просто JOIN):

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

    • Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, для столбцов правой таблицы будут NULL.
    • Ключевой для тестирования сценариев с необязательными связями. Например, чтобы найти всех пользователей, даже если у них нет заказов.
      SELECT u.username, o.id AS order_id
      FROM users u
      LEFT JOIN orders o ON u.id = o.user_id
      WHERE o.id IS NULL; -- Находит пользователей без заказов
  3. RIGHT JOIN (или RIGHT OUTER JOIN):

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

    • Возвращает все строки из обеих таблиц. Если совпадения нет, недостающие столбцы заполняются NULL.
    • Полезен для полного сравнения двух наборов данных (например, при миграции или синхронизации).
      -- Найти всех клиентов и все заказы, сопоставив их где возможно
      SELECT c.id AS customer_id, o.id AS order_id
      FROM customers c
      FULL OUTER JOIN orders o ON c.id = o.customer_id;
  5. CROSS JOIN:

    • Декартово произведение: каждая строка первой таблицы соединяется с каждой строкой второй.
    • Может быть полезен в тестах для генерации всевозможных комбинаций данных (например, все цвета и все размеры товара).
  6. SELF JOIN:

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

При тестировании я обращаю внимание не только на корректность результата JOIN, но и на его производительность (наличие индексов на полях соединения) и на то, чтобы тип JOIN соответствовал бизнес-логике (например, INNER JOIN не "потерял" данные, которые должны были быть в отчёте).