JOIN объединяет строки из двух таблиц, сопоставляя их по условию, обычно по внешнему ключу. Тип соединения решает, что происходит со строками, у которых нет совпадения на другой стороне.
JOIN объединяет строки из двух таблиц, сопоставляя их по условию, обычно по внешнему ключу. Тип соединения решает, что происходит со строками, у которых нет совпадения на другой стороне.
NULL.-- customers(id, name) orders(id, customer_id, total)
-- INNER: только клиенты, у которых есть хотя бы один заказ
SELECT c.name, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
-- LEFT: каждый клиент, даже те, у кого ноль заказов (total = NULL)
SELECT c.name, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- Классическое применение: найти клиентов БЕЗ заказов
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- сторона NULL у LEFT JOIN выявляет пробел
WHERE (например, WHERE o.total > 100) незаметно превращает LEFT JOIN обратно в INNER JOIN, потому что NULL > 100 — ложь. Помещайте такие условия в предложение ON, если хотите сохранить несовпавшие строки.Большинство реальных запросов охватывают несколько таблиц, и неправильный тип соединения тихо отбрасывает или дублирует строки — баг, который возвращает правдоподобные результаты. Знание того, что LEFT JOIN + IS NULL находит "недостающие" строки, а WHERE по стороне NULL отменяет LEFT, предотвращает целый класс ошибок в отчётах.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать