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

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

1.6 Junior🔥 122 комментариев
#Базы данных

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Разница между LEFT JOIN и RIGHT JOIN в SQL

LEFT JOIN (левый внешний соединение) и RIGHT JOIN (правый внешний соединение) — это два типа внешних соединений (OUTER JOIN) в SQL, которые используются для объединения данных из двух таблиц с сохранением всех строк из одной из таблиц, даже если для них нет соответствий в другой таблице. Основное различие заключается в том, какая таблица считается "главной" в операции соединения.

Ключевые различия

1. Основная (сохраняемая) таблица

  • LEFT JOIN: Сохраняет все строки из левой таблицы (первой в запросе), даже если нет совпадений в правой таблице.
  • RIGHT JOIN: Сохраняет все строки из правой таблицы (второй в запросе), даже если нет совпадений в левой таблице.

2. Синтаксис и логика работы

-- LEFT JOIN: Все строки из таблицы A + совпадения из B
SELECT *
FROM таблица_A A
LEFT JOIN таблица_B B ON A.id = B.a_id;

-- RIGHT JOIN: Все строки из таблицы B + совпадения из A
SELECT *
FROM таблица_A A
RIGHT JOIN таблица_B B ON A.id = B.a_id;

3. Результаты при отсутствии совпадений

  • В LEFT JOIN для строк левой таблицы без совпадений в правой таблице, столбцы из правой таблицы будут содержать NULL.
  • В RIGHT JOIN для строк правой таблицы без совпадений в левой таблице, столбцы из левой таблицы будут содержать NULL.

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

Рассмотрим две таблицы:

-- Таблица пользователей
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- Таблица заказов
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10,2)
);

-- Данные
INSERT INTO users VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Виктор');
INSERT INTO orders VALUES (101, 1, 100.00), (102, 1, 200.00), (103, 3, 150.00);

LEFT JOIN пример:

SELECT u.name, o.id, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Результат:

Анна    101    100.00
Анна    102    200.00
Борис   NULL   NULL    -- Борис есть в users, но нет заказов
Виктор  103    150.00

RIGHT JOIN пример:

SELECT u.name, o.id, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

Результат:

Анна    101    100.00
Анна    102    200.00
Виктор  103    150.00
-- Заметим: Борис отсутствует, так как у него нет заказов

Важные особенности

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

    -- Эти два запроса эквивалентны
    SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;
    SELECT * FROM B LEFT JOIN A ON A.id = B.a_id;
    
  2. Производительность: В большинстве СУБД нет разницы в производительности между LEFT и RIGHT JOIN при эквивалентных запросах.

  3. Читаемость кода:

    • LEFT JOIN используется значительно чаще (более 90% случаев по статистике)
    • Цепочки JOIN обычно пишутся слева направо, поэтому LEFT JOIN логичнее читается
    • RIGHT JOIN может ухудшать читаемость, особенно в сложных запросах с несколькими соединениями
  4. Полное внешнее соединение: Существует также FULL OUTER JOIN, который сохраняет все строки из обеих таблиц (не поддерживается в MySQL без эмуляции).

Рекомендации по использованию

  • Используйте LEFT JOIN как стандартный выбор — это улучшает согласованность кода
  • RIGHT JOIN может быть полезен в специфических случаях, когда логика запроса естественнее выражается через правые соединения
  • Всегда проверяйте NULL значения в результатах внешних соединений
  • Используйте COALESCE() для обработки возможных NULL значений:
    SELECT u.name, COALESCE(SUM(o.amount), 0) as total
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    GROUP BY u.id, u.name;
    

В контексте Go-разработки

При работе с SQL в Go через драйверы типа database/sql или ORM (GORM, sqlx), понимание различий между типами JOIN критически важно:

// Пример с GORM
var results []struct {
    UserName string
    OrderID  uint
    Amount   float64
}

// LEFT JOIN в GORM
db.Table("users").
    Select("users.name, orders.id, orders.amount").
    Joins("LEFT JOIN orders ON users.id = orders.user_id").
    Scan(&results)

Вывод: Хотя LEFT JOIN и RIGHT JOIN функционально симметричны, на практике LEFT JOIN предпочтительнее из-за лучшей читаемости и более широкого использования в сообществе разработчиков. Понимание их различий позволяет писать более эффективные и понятные SQL-запросы, что особенно важно при работе с реляционными базами данных в Go-приложениях.

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