← Назад к вопросам
В чем разница между INNER, LEFT и RIGHT JOIN?
1.0 Junior🔥 291 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
INNER, LEFT и RIGHT JOIN
Это три способа объединения таблиц в SQL с разными стратегиями выбора строк.
INNER JOIN
Возвращает только строки, где есть совпадение в обеих таблицах.
SELECT * FROM users
INNER JOIN orders ON users.id = orders.user_id;
Пример:
users: 1-Alice, 2-Bob, 3-Charlie
orders: user_id=1, user_id=2
Результат: Alice(1), Bob(2)
Charlie исключена (нет заказов)
Node.js:
const result = await userRepository
.createQueryBuilder('user')
.innerJoin('user.orders', 'order')
.getMany();
LEFT JOIN (LEFT OUTER JOIN)
Возвращает все строки из левой таблицы + совпадающие из правой. Несовпадающие из правой будут NULL.
SELECT * FROM users
LEFT JOIN orders ON users.id = orders.user_id;
Пример:
users: 1-Alice, 2-Bob, 3-Charlie
orders: user_id=1, user_id=2
Результат:
Alice(1) with order
Bob(2) with order
Charlie(3) with NULL (нет заказов)
Node.js:
const result = await userRepository
.createQueryBuilder('user')
.leftJoinAndSelect('user.orders', 'order')
.getMany();
RIGHT JOIN (RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы + совпадающие из левой. Несовпадающие из левой будут NULL.
SELECT * FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
Пример:
users: 1-Alice, 2-Bob, 3-Charlie
orders: user_id=1, user_id=2, user_id=4
Результат:
Alice(1) with order
Bob(2) with order
NULL with order (user_id=4 не существует)
Сравнение
| Тип | Левая таблица | Правая таблица | Совпадения |
|---|---|---|---|
| INNER | ✓ (совпадающие) | ✓ (совпадающие) | Только совпадающие |
| LEFT | ✓ (все) | ✓ (совпадающие) | Левая таблица полная |
| RIGHT | ✓ (совпадающие) | ✓ (все) | Правая таблица полная |
| FULL OUTER | ✓ (все) | ✓ (все) | Все из обеих |
Практические примеры
INNER JOIN (только с заказами):
const usersWithOrders = await db.query(`
SELECT u.name, COUNT(o.id) as order_count
FROM users u
INNER JOIN orders o ON u.id = o.user_id
GROUP BY u.id
`);
// Alice: 2 заказа, Bob: 1 заказ
LEFT JOIN (все пользователи):
const allUsers = await db.query(`
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
`);
// Alice: 2, Bob: 1, Charlie: 0
RIGHT JOIN (все заказы, даже сиротские):
const allOrders = await db.query(`
SELECT u.name, o.id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id
`);
// Покажет заказы без пользователя как NULL
Когда использовать?
INNER JOIN (частый):
- Нужны только связанные данные
- Фильтрация по наличию связи
- Пример: все пользователи с заказами
LEFT JOIN (частый):
- Нужны все данные из левой таблицы
- Опциональные данные из правой
- Пример: все пользователи + их заказы (или пусто)
RIGHT JOIN (редкий):
- Нужны все данные из правой таблицы
- Редко используется (можно переписать на LEFT)
- Пример: все заказы + информация о пользователе
Диаграмма Венна
LEFT: INNER: RIGHT:
L L∩R L∩R L∩R R
█████ ███ ███████
Заключение
- INNER — только совпадающие
- LEFT — все из левой + совпадающие из правой
- RIGHT — совпадающие из левой + все из правой
- FULL OUTER — все из обеих