Какой результат будет при объединении двух таблиц с помощью LEFT JOIN на примере кругов Эйлера?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Визуализация 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_id | name | order_id | amount |
|---|---|---|---|
| 1 | Анна | 100 | 500.00 |
| 1 | Анна | 101 | 300.00 |
| 2 | Борис | NULL | NULL |
| 3 | Виктор | 102 | 700.00 |
Анализ результата через круги Эйлера
-
Анна (id=1) — находится в пересечении кругов, так как у неё есть заказы (100, 101). Её данные присутствуют в обеих таблицах → в результат попадают обе строки с заказами.
-
Борис (id=2) — находится только в левом круге (users), так как у него нет заказов. При LEFT JOIN его строка сохраняется, а колонки из правой таблицы (
order_id,amount) заполняютсяNULL. -
Виктор (id=3) — как и Анна, находится в пересечении, так как у него есть заказ 102 → данные соединяются.
-
Воображаемый пользователь из 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-значения в колонках правой таблицы сигнализируют об отсутствии соответствия.