Что такое JOIN в SQL и какие типы JOIN существуют?

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

Ответ

JOIN в SQL — это операция объединения строк из двух или более таблиц на основе логической связи между ними. JOIN позволяет извлекать связанные данные, избегая дублирования информации и соблюдая нормализацию базы данных.

Базовый синтаксис:

SELECT таблица1.столбец, таблица2.столбец
FROM таблица1
[ТИП_JOIN] таблица2 ON таблица1.ключ = таблица2.ключ

Основные типы JOIN:

  1. INNER JOIN — возвращает только совпадающие строки из обеих таблиц

    -- Заказы с информацией о клиентах
    SELECT orders.id, customers.name, orders.amount
    FROM orders
    INNER JOIN customers ON orders.customer_id = customers.id;
    -- Результат: только заказы, у которых есть клиент в таблице customers
  2. LEFT (OUTER) JOIN — все строки из левой таблицы + совпадающие из правой

    -- Все клиенты и их заказы (даже если заказов нет)
    SELECT customers.name, orders.id
    FROM customers
    LEFT JOIN orders ON customers.id = orders.customer_id;
    -- Клиенты без заказов будут иметь NULL в orders.id
  3. RIGHT (OUTER) JOIN — все строки из правой таблицы + совпадающие из левой

    -- Все заказы и информация о клиентах (даже если клиент удален)
    SELECT orders.id, customers.name
    FROM orders
    RIGHT JOIN customers ON orders.customer_id = customers.id;
  4. FULL (OUTER) JOIN — объединение LEFT и RIGHT JOIN

    -- Все клиенты и все заказы
    SELECT customers.name, orders.id
    FROM customers
    FULL JOIN orders ON customers.id = orders.customer_id;
    -- Будут строки: клиенты без заказов + заказы без клиентов
  5. CROSS JOIN — декартово произведение (все комбинации строк)

    -- Все возможные комбинации цветов и размеров
    SELECT colors.name, sizes.name
    FROM colors
    CROSS JOIN sizes;
  6. SELF JOIN — соединение таблицы с самой собой

    -- Иерархия сотрудников (менеджер → подчиненный)
    SELECT e1.name AS employee, e2.name AS manager
    FROM employees e1
    LEFT JOIN employees e2 ON e1.manager_id = e2.id;

Визуализация результатов:

Таблица A      Таблица B       INNER JOIN    LEFT JOIN     FULL JOIN
id | name     id | value      A.id | name | value     A.id | name | value     A.id | name | value
---|-----     ---|-----       -----|------|-----     -----|------|-----     -----|------|-----
1  | Alice    1  | 100        1    | Alice| 100       1    | Alice| 100       1    | Alice| 100
2  | Bob      3  | 300        3    | Carol| 300       2    | Bob  | NULL      2    | Bob  | NULL
3  | Carol                      
                              3    | Carol| 300       NULL | NULL | 300       NULL | NULL | 300

Ключевые моменты:

  • Производительность — JOIN без индексов на ключевых полях может быть медленным
  • Алиасы (aliases) — обязательны при соединении таблицы с самой собой
  • Множественные JOIN — можно соединять несколько таблиц в одном запросе
  • USING — сокращенная запись при одинаковых именах столбцов: JOIN ... USING (customer_id)
  • NATURAL JOIN — автоматическое соединение по одинаковым именам столбцов (использовать с осторожностью)

Пример сложного запроса:

-- Заказы с информацией о клиентах и товарах
SELECT o.order_date, c.name AS customer, p.name AS product, oi.quantity
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.status = 'completed'
ORDER BY o.order_date DESC;