SQL JOIN: объединение таблиц
JOIN — основа реляционных баз данных. На каждом SQL-собеседовании обязательно будет задача с объединением таблиц. Разберём все виды JOIN с реальными примерами.
Содержание
Что такое JOIN
JOIN объединяет строки из двух таблиц по условию. Результат — новая таблица, где каждая строка содержит данные из обеих.
Самый частый пример: таблица orders хранит user_id, но не имя пользователя. Чтобы получить имя — нужен JOIN с таблицей users.
SELECT o.id, u.name, o.amount
FROM orders o
JOIN users u ON o.user_id = u.id;INNER JOIN — только совпадения
INNER JOIN (или просто JOIN) возвращает только те строки, для которых есть совпадение в обеих таблицах.
Если пользователь не сделал ни одного заказа — он не попадёт в результат. Если заказ без пользователя — тоже не попадёт.
-- Заказы только тех пользователей, которые есть в таблице users
SELECT u.name, COUNT(o.id) AS orders_count
FROM users u
INNER JOIN orders o ON u.id = o.user_id
GROUP BY u.name;LEFT JOIN — все строки левой таблицы
LEFT JOIN возвращает все строки из левой таблицы, даже если в правой нет совпадений. В этом случае колонки правой таблицы заполняются NULL.
Типичное применение: найти пользователей, которые ещё не сделали ни одного заказа.
-- Пользователи без заказов (NULL в order_id)
SELECT u.name, o.id AS order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;RIGHT JOIN и FULL OUTER JOIN
RIGHT JOIN — симметрично LEFT JOIN: все строки из правой таблицы, даже без совпадений в левой. На практике используется редко — обычно можно переписать как LEFT JOIN поменяв таблицы местами.
FULL OUTER JOIN возвращает все строки из обеих таблиц. Там, где нет совпадений — NULL.
-- Все пользователи И все заказы, даже без пары
SELECT u.name, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;JOIN нескольких таблиц
В реальных задачах часто нужно объединить 3 и более таблиц. Каждый следующий JOIN добавляется к результату предыдущего.
-- Заказы с именем пользователя и названием товара
SELECT u.name, p.title, o.amount
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN products p ON o.product_id = p.id
WHERE o.created_at >= '2024-01-01';Частые ошибки с JOIN
1. Декартово произведение: забыли условие ON — результат будет N×M строк. 2. Неоднозначность колонок: обе таблицы имеют колонку id — нужно указать префикс (o.id или u.id). 3. NULL в условии: JOIN по колонке с NULL не даст совпадений (NULL ≠ NULL). 4. Дубли: один-ко-многим JOIN умножает строки — используй COUNT(DISTINCT ...) или агрегацию.
-- Ошибка: дубли из-за один-ко-многим
SELECT u.name, SUM(o.amount) -- правильно
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.name;Закрепи знания на практике
Решай реальные задачи с собеседований прямо в браузере — без установки.
Решить задачи на JOIN →