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

Что такое LEFT JOIN?

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

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

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

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

Что такое LEFT JOIN?

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

Основная логика работы LEFT JOIN

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

  • Левая таблица (TableA) — основная таблица, из которой мы хотим получить все записи.
  • Правая таблица (TableB) — вспомогательная таблица, из которой мы хотим получить связанные данные.

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

Синтаксис в SQL

SELECT column_list
FROM TableA
LEFT JOIN TableB 
    ON TableA.key_column = TableB.key_column;

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

Рассмотрим базу данных интернет-магазина:

Таблица Customers (клиенты):

CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    CustomerName VARCHAR(50)
);

INSERT INTO Customers VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Виктор');

Таблица Orders (заказы):

CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT,
    OrderAmount DECIMAL(10,2),
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

INSERT INTO Orders VALUES (101, 1, 1500.00), (102, 1, 800.50), (103, 2, 320.75);

Теперь выполним LEFT JOIN, чтобы получить всех клиентов и их заказы:

SELECT 
    c.CustomerName,
    o.OrderId,
    o.OrderAmount
FROM Customers c
LEFT JOIN Orders o 
    ON c.CustomerId = o.CustomerId
ORDER BY c.CustomerName;

Результат запроса:

CustomerNameOrderIdOrderAmount
Анна1011500.00
Анна102800.50
Борис103320.75
ВикторNULLNULL

Обратите внимание на последнюю строку: клиент Виктор не имеет заказов, но всё равно присутствует в результате с NULL значениями из таблицы Orders.

Ключевые особенности LEFT JOIN

  • Сохраняет все записи левой таблицы — это главное отличие от INNER JOIN
  • Возвращает NULL для несовпадающих записей правой таблицы
  • Порядок таблиц важенA LEFT JOIN BB LEFT JOIN A
  • Производительность — может быть менее эффективен, чем INNER JOIN, особенно при работе с большими таблицами
  • Используется с условием ON для указания критерия соединения

Типичные сценарии использования

  1. Аналитика и отчётность — когда нужно показать все сущности, даже если по ним нет активности
  2. Поиск отсутствующих данных — с помощью фильтрации по NULL значениям
  3. Агрегация данных — подсчёт количества заказов для всех клиентов, включая тех, у кого заказов нет
  4. Иерархические структуры — получение всех родительских элементов с дочерними, если они существуют

Пример поиска клиентов без заказов

SELECT 
    c.CustomerName,
    'Не делал заказов' AS Status
FROM Customers c
LEFT JOIN Orders o 
    ON c.CustomerId = o.CustomerId
WHERE o.OrderId IS NULL;

Результат:

CustomerNameStatus
ВикторНе делал заказов

Сравнение с другими типами JOIN

  • INNER JOIN — возвращает только совпадающие записи из обеих таблиц
  • RIGHT JOIN — обратный LEFT JOIN, возвращает все записи из правой таблицы
  • FULL OUTER JOIN — возвращает все записи из обеих таблиц

Важные замечания для разработчиков C#

При работе с ORM, такими как Entity Framework Core, LEFT JOIN часто выполняется неявно:

// Пример с Entity Framework Core
var customersWithOrders = context.Customers
    .Include(c => c.Orders) // LEFT JOIN выполняется автоматически
    .Select(c => new 
    {
        c.Name,
        OrderCount = c.Orders.Count(),
        TotalAmount = c.Orders.Sum(o => o.Amount)
    })
    .ToList();

Однако в сложных сценариях может потребоваться явное указание JOIN:

var query = from c in context.Customers
            join o in context.Orders 
                on c.Id equals o.CustomerId into customerOrders
            from co in customerOrders.DefaultIfEmpty() // Аналог LEFT JOIN
            select new 
            {
                c.Name,
                OrderId = (int?)co.Id,
                Amount = (decimal?)co.Amount
            };

LEFT JOIN — мощный инструмент для работы с реляционными данными, который позволяет получать полную картину даже при отсутствии связей между записями. Понимание его работы критически важно для написания корректных SQL-запросов и эффективной работы с базами данных в backend-разработке на C#.

Что такое LEFT JOIN? | PrepBro