JOIN в SQL нужен, чтобы объединять данные из нескольких таблиц по общему полю. Это одна из базовых тем для аналитиков, backend-разработчиков и всех, кто работает с БД.
Представим 2 таблицы:
users
idname
orders
iduser_idproduct
Данные:
users
- 1, Анна
- 2, Иван
- 3, Ольга
orders
- 101, 1, Ноутбук
- 102, 1, Мышь
- 103, 2, Клавиатура
1. INNER JOIN
Возвращает только те строки, где совпадение есть в обеих таблицах.
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
Результат:
- Анна — Ноутбук
- Анна — Мышь
- Иван — Клавиатура
👉 Ольга не попадёт в результат, потому что у неё нет заказов.
2. LEFT JOIN
Возвращает все строки из левой таблицы и совпадения из правой. Если совпадений нет — будут NULL.
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
Результат:
- Анна — Ноутбук
- Анна — Мышь
- Иван — Клавиатура
- Ольга — NULL
👉 LEFT JOIN часто используют, когда нужно найти записи “без связей”: пользователей без заказов, товары без продаж, сотрудников без задач.
Пример:
SELECT users.name
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;
3. RIGHT JOIN
Работает зеркально: возвращает все строки из правой таблицы и совпадения из левой.
SELECT users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
В нашем примере результат будет как у INNER JOIN, потому что у всех заказов есть пользователь.
⚠️ На практике RIGHT JOIN используют реже. Обычно запрос переписывают через LEFT JOIN для лучшей читаемости.
4. FULL JOIN
Возвращает все строки из обеих таблиц: и совпавшие, и несовпавшие.
SELECT users.name, orders.product
FROM users
FULL JOIN orders ON users.id = orders.user_id;
Если бы в orders был заказ с user_id, которого нет в users, он тоже попал бы в результат.
Как быстро запомнить
INNER— только пересечениеLEFT— всё из левой + совпадения справаRIGHT— всё из правой + совпадения слеваFULL— всё из обеих таблиц
Важный нюанс ⚙️
Ошибка новичков — фильтровать LEFT JOIN через WHERE по правой таблице и случайно превращать его в INNER JOIN.
Пример:
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.product = 'Ноутбук';
Здесь строки с NULL отфильтруются. Если нужно сохранить логику LEFT JOIN, условие лучше переносить в ON.
Итог
JOIN-ы — основа работы с реляционными БД. Если понимать разницу между INNER, LEFT, RIGHT и FULL, можно уверенно писать отчёты, собирать витрины данных и разбирать сложные запросы 📊
👀 Ниже стоит посмотреть подборку каналов про IT — там много полезного по SQL, backend, аналитике и разработке.