← Назад к вопросам

В чем разница между 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 — все из обеих
В чем разница между INNER, LEFT и RIGHT JOIN? | PrepBro