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

Какой результат будет при объединении двух таблиц с помощью LEFT JOIN на примере кругов Эйлера?

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

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

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

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

Визуализация LEFT JOIN через круги Эйлера

LEFT JOIN — это операция, сохраняющая все строки из левой таблицы (даже если для них нет соответствий в правой), и добавляющая данные из правой таблицы только при наличии совпадения по условию соединения. На кругах Эйлера это выглядит так:

Левая таблица (A)        Правая таблица (B)
      ○                       ○
   ┌──────┐                ┌──────┐
   │  A   │                │  B   │
   └──┬───┘                └──┬───┘
      │      LEFT JOIN        │
      └───────►  A ∩ B  ◄─────┘
           + все остальное из A

Результатом будет полностью левый круг A, а из правого круга B — только пересекающаяся часть (A ∩ B). Непересекающаяся часть B отбрасывается.

Конкретный пример с SQL

Предположим, у нас есть таблица users и таблица orders:

-- Левая таблица: пользователи
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 
(100, 1, 500.00),
(101, 1, 300.00),
(102, 3, 700.00);

Выполним LEFT JOIN:

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

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

user_idnameorder_idamount
1Анна100500.00
1Анна101300.00
2БорисNULLNULL
3Виктор102700.00

Анализ результата через круги Эйлера

  1. Анна (id=1) — находится в пересечении кругов, так как у неё есть заказы (100, 101). Её данные присутствуют в обеих таблицах → в результат попадают обе строки с заказами.

  2. Борис (id=2) — находится только в левом круге (users), так как у него нет заказов. При LEFT JOIN его строка сохраняется, а колонки из правой таблицы (order_id, amount) заполняются NULL.

  3. Виктор (id=3) — как и Анна, находится в пересечении, так как у него есть заказ 102 → данные соединяются.

  4. Воображаемый пользователь из orders без users — если бы в таблице orders был заказ с user_id=4 (несуществующий пользователь), эта строка не попала бы в результат, так как LEFT JOIN сохраняет только левый круг полностью, а правый — только пересекающуюся часть.

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

  • Гарантированное сохранение всех записей левой таблицы — даже без совпадений в правой.
  • Расширение данных — когда есть совпадение, строка "расширяется" колонками из правой таблицы.
  • Возможность фильтрации — можно искать именно отсутствующие соответствия:
-- Найти пользователей без заказов
SELECT u.*
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
-- Вернёт только Бориса
  • Множественные совпадения — если в правой таблице несколько строк подходят под условие JOIN, левая строка будет дублирована для каждого совпадения (как у Анны с двумя заказами).

Практическое применение

LEFT JOIN особенно полезен в сценариях:

  • Аналитика с возможными пропусками данных — например, отчёт по всем клиентам, включая тех, кто ещё не совершил покупок.
  • Каскадные выборки — получение основной сущности со связанными данными, которые могут отсутствовать.
  • Валидация данных — поиск записей, для которых отсутствуют обязательные связи (через WHERE right_table.id IS NULL).

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