LEFT JOIN используют, когда нужно сохранить строки из левой таблицы, даже если в правой нет совпадений. Но одно неверное условие в WHERE — и LEFT JOIN незаметно превращается в INNER JOIN.Таблицы:
users(id, email)
orders(id, user_id, amount)
Нужно получить всех пользователей и их заказы (если есть):
SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
Если у пользователя нет заказов, поля из
orders будут NULL — это ожидаемое поведение LEFT JOIN.Теперь типичная ошибка:
SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.amount > 100;
Условие в
WHERE отфильтровывает строки, где o.amount IS NULL.В результате пользователи без заказов исчезают, и запрос фактически работает как
INNER JOIN.Правильный вариант — переносить условия на правую таблицу в
ON:SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id
AND o.amount > 100;
Теперь: пользователи без заказов остаются в результате, фильтрация применяется только к связанным строкам
orders.Если же логика действительно требует убрать пользователей без заказов, тогда честнее писать
INNER JOIN:SELECT
u.id,
u.email,
o.amount
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.amount > 100;
Так намерение запроса читается однозначно.
🔥 Условия в
WHERE применяются после JOIN и могут уничтожить строки с NULL. Условия в ON влияют только на логику связывания таблиц.➡️ SQL Ready | #практика