Ответ
JOIN в SQL — это операция объединения строк из двух или более таблиц на основе логической связи между ними. JOIN позволяет извлекать связанные данные, избегая дублирования информации и соблюдая нормализацию базы данных.
Базовый синтаксис:
SELECT таблица1.столбец, таблица2.столбец
FROM таблица1
[ТИП_JOIN] таблица2 ON таблица1.ключ = таблица2.ключ
Основные типы JOIN:
-
INNER JOIN — возвращает только совпадающие строки из обеих таблиц
-- Заказы с информацией о клиентах SELECT orders.id, customers.name, orders.amount FROM orders INNER JOIN customers ON orders.customer_id = customers.id; -- Результат: только заказы, у которых есть клиент в таблице customers -
LEFT (OUTER) JOIN — все строки из левой таблицы + совпадающие из правой
-- Все клиенты и их заказы (даже если заказов нет) SELECT customers.name, orders.id FROM customers LEFT JOIN orders ON customers.id = orders.customer_id; -- Клиенты без заказов будут иметь NULL в orders.id -
RIGHT (OUTER) JOIN — все строки из правой таблицы + совпадающие из левой
-- Все заказы и информация о клиентах (даже если клиент удален) SELECT orders.id, customers.name FROM orders RIGHT JOIN customers ON orders.customer_id = customers.id; -
FULL (OUTER) JOIN — объединение LEFT и RIGHT JOIN
-- Все клиенты и все заказы SELECT customers.name, orders.id FROM customers FULL JOIN orders ON customers.id = orders.customer_id; -- Будут строки: клиенты без заказов + заказы без клиентов -
CROSS JOIN — декартово произведение (все комбинации строк)
-- Все возможные комбинации цветов и размеров SELECT colors.name, sizes.name FROM colors CROSS JOIN sizes; -
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;