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

В чем разница между LEFT JOIN и RIGHT JOIN?

1.2 Junior🔥 241 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

LEFT JOIN и RIGHT JOIN: полное понимание

Это базовые операции в SQL, которые каждый разработчик должен понимать глубоко, так как неправильное их использование приводит к логическим ошибкам и проблемам с производительностью.

Основной принцип

LEFT JOIN (левое внешнее соединение) возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если совпадений нет, то поля из правой таблицы будут NULL.

RIGHT JOIN (правое внешнее соединение) возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если совпадений нет, то поля из левой таблицы будут NULL.

Синтаксис и примеры

-- LEFT JOIN: все пользователи + их заказы (если есть)
SELECT u.id, u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- Результат:
-- id | name | order_id
-- 1  | Alice | 101
-- 2  | Bob | 102
-- 3  | Charlie | NULL (нет заказов)
-- RIGHT JOIN: все заказы + соответствующие пользователи
SELECT u.id, u.name, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- Результат:
-- id | name | order_id
-- 1 | Alice | 101
-- 2 | Bob | 102
-- NULL | NULL | 999 (заказ без привязанного пользователя)

Взаимозаменяемость

Важный момент: RIGHT JOIN полностью заменяем на LEFT JOIN просто переставив таблицы местами:

-- Эти два запроса эквивалентны:
SELECT u.id, u.name, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- Аналогично:
SELECT u.id, u.name, o.order_id
FROM orders o
LEFT JOIN users u ON u.id = o.user_id;

INNER JOIN vs LEFT/RIGHT JOIN

INNER JOIN возвращает только строки с совпадениями в обеих таблицах. Это более быстрый вариант, когда нужны только связанные данные.

-- INNER JOIN: только пользователи с заказами
SELECT u.id, u.name, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- id=3 (Charlie без заказов) не появится

Проверка NULL для фильтрации

Основная разница в использовании — фильтрация NULL значений:

-- Пользователи БЕЗ заказов (используем LEFT JOIN + проверка NULL)
SELECT u.id, u.name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.order_id IS NULL;
-- Результат: только Charlie

-- Заказы БЕЗ привязанного пользователя (используем RIGHT JOIN)
SELECT o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id
WHERE u.id IS NULL;

Performance и best practices

  • Используй LEFT JOIN чаще, так как это более стандартный и понятный синтаксис
  • RIGHT JOIN встречается реже; лучше переписать на LEFT JOIN для читаемости
  • Проверяй EXPLAIN ANALYZE для оптимизации
  • Индексы на колонках соединения (ON условия) критичны для производительности
  • Избегай LEFT JOIN с фильтрацией в WHERE (переноси в ON)

Практический PHP пример

// Получить пользователей и их заказы
$sql = 'SELECT u.id, u.name, o.order_id, o.total
        FROM users u
        LEFT JOIN orders o ON u.id = o.user_id
        WHERE u.is_active = 1
        ORDER BY u.id';

$users = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);

// Группировка результатов
$grouped = [];
foreach ($users as $row) {
    if (!isset($grouped[$row['id']])) {
        $grouped[$row['id']] = ['name' => $row['name'], 'orders' => []];
    }
    if ($row['order_id']) {
        $grouped[$row['id']]['orders'][] = $row['order_id'];
    }
}

Вывод

RIGHT JOIN и LEFT JOIN имеют одинаковую логику, но работают в противоположных направлениях. Профессиональные разработчики предпочитают LEFT JOIN, так как это более интуитивно и легко читается. Главное — понимать, какую таблицу ты помещаешь в «основание» запроса и какие данные ты ожидаешь получить.