Коротка відповідь
juniorLEFT JOIN — це оператор, що повертає всі рядки з лівої таблиці і відповідні рядки з правої, заповнюючи NULL, коли співпадіння відсутнє. Він дозволяє зберегти повну інформацію про головний набір даних, навіть коли зв’язок не існує.
Повне пояснення
Що це і навіщо
LEFT JOIN (або LEFT OUTER JOIN) повертає всі рядки з лівої таблиці незалежно від того, чи існує відповідний запис у правій. Якщо співпадіння не знайдено, значення з правої таблиці заповнюються NULL. Це корисно, коли потрібно отримати повний список елементів (наприклад, усі користувачі) разом із додатковими даними (замовлення), які можуть бути відсутні.
Ключові принципи
- Операція:
SELECT * FROM A LEFT JOIN B ON A.id = B.a_id; - Результат: кожен рядок з A, плюс відповідний рядок з B або NULL.
- Відмінність від INNER JOIN: INNER повертає лише ті рядки, де існує співпадіння обох таблиць.
Як це працює
SQL‑запит спочатку виконує сканування лівої таблиці, потім для кожного рядка шукає відповідний у правій. Якщо не знайдено, заповнюються NULL.
Практика й реалізація
-- Показуємо усіх користувачів і їх замовлення, якщо вони є
SELECT u.id, u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
У PostgreSQL, MySQL, SQLite та ін. синтаксис однаковий.
Тестування
// Jest + Prisma
const users = await prisma.user.findMany({
include: { orders: true }, // LEFT JOIN
});
expect(users[0].orders).toBeDefined();
Оптимізація запитів
- Створіть індекс на
orders.user_id. - Використовуйте
EXPLAINдля перевірки плану виконання.
Безпека
Підтримуйте параметризовані запити, щоб уникнути SQL‑ін’єкцій.
Особливості в контексті ORM
У Prisma include генерує LEFT JOIN, а у Sequelize – left: true в опціях include.
Часті помилки
- Очікування, що LEFT JOIN поверне NULL‑значення у всіх колонках правої таблиці.
- Забудьте про
ON‑умову, що призводить до крос‑продукту. - Не індексуєте колонки, що використовуються в
ON. - Використання LEFT JOIN замість INNER JOIN, коли потрібні лише співпадаючі рядки.
- Не враховуєте NULL‑значення при агрегації.
- Підрахунок кількості рядків без
DISTINCTу LEFT JOIN. - Застосування LEFT JOIN до великої таблиці без підготовки індексів.
- Не перевіряєте, чи потрібен повний набір даних, що збільшує навантаження.
Cheatsheet
LEFT JOIN– всі з лівої, NULL якщо немає правої.RIGHT JOIN– навпаки.INNER JOIN– лише співпадаючі.FULL OUTER JOIN– обидві таблиці, NULL там, де немає співпадіння.
Follow‑up питання
- Як перевірити, що LEFT JOIN не створює «пусті» рядки?
- Які індекси найкраще працюють з LEFT JOIN у PostgreSQL?