Какие типы JOIN в SQL вы знаете? Приведите примеры использования.

«Какие типы JOIN в SQL вы знаете? Приведите примеры использования.» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В работе с реляционными базами данных я постоянно использую различные типы JOIN для объединения данных из связанных таблиц.

Основные типы JOIN (на примере PostgreSQL/MySQL синтаксиса):

Предположим, у нас есть две таблицы: users (id, name) и orders (id, user_id, amount).

  1. INNER JOIN Возвращает только те строки, где есть совпадение в обеих таблицах. Это самый частый JOIN в моих запросах.

    -- Найти всех пользователей, сделавших заказы, и их заказы
    SELECT users.name, orders.amount, orders.id
    FROM users
    INNER JOIN orders ON users.id = orders.user_id;

    Пользователи без заказов и заказы без привязанного пользователя (если такое возможно) в результат не попадут.

  2. LEFT (OUTER) JOIN Возвращает все строки из левой таблицы (users), даже если для них нет совпадений в правой. Если совпадения нет, поля из правой таблицы будут NULL.

    -- Найти ВСЕХ пользователей и их заказы (если есть)
    SELECT users.name, orders.amount
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id;

    Этот запрос вернет и пользователей, которые никогда не делали заказов. Для них orders.amount будет NULL. Я часто использую LEFT JOIN для анализа полноты данных или построения отчетов, где нужно видеть всех клиентов.

  3. RIGHT (OUTER) JOIN Аналог LEFT JOIN, но возвращает все строки из правой таблицы. На практике использую его гораздо реже, так как любой RIGHT JOIN можно переписать как LEFT JOIN, поменяв таблицы местами.

  4. FULL (OUTER) JOIN Возвращает все строки из обеих таблиц. Если совпадения нет, недостающие поля заполняются NULL.

    -- Получить полную картину связей, включая "осиротевшие" записи
    SELECT users.name, orders.id
    FROM users
    FULL OUTER JOIN orders ON users.id = orders.user_id;

    Полезен для аудита данных, чтобы найти как пользователей без заказов, так и заказы без валидного пользователя.

  5. CROSS JOIN Возвращает декартово произведение строк — каждую строку из первой таблицы со всеми строками из второй. Использую осознанно и редко, например, для генерации всех возможных комбинаций (все дни месяца × все товары).

    SELECT sizes.size, colors.color
    FROM sizes
    CROSS JOIN colors;
  6. SELF JOIN Это не отдельный синтаксис, а паттерн, когда таблица соединяется сама с собой. Часто требуется для иерархических данных (например, таблица employees с полем manager_id).

    -- Найти сотрудников и их непосредственных руководителей
    SELECT e.name AS employee, m.name AS manager
    FROM employees e
    LEFT JOIN employees m ON e.manager_id = m.id;

Ключевое для производительности — наличие корректных индексов на полях, участвующих в условии ON (в нашем случае users.id и orders.user_id).