Короткий ответ При LEFT JOIN условие в ON определяет, какие правые строки можно присоединить, но не удаляет строку слева. Фильтр в WHERE применяется к уже соединённому результату и может исключить строку с NULL справа. Как это работает подробнее Если оплаченного заказа нет, соединение с условием o.status = 'paid' в ON всё равно вернёт клиента, а поля заказа будут NULL. При таком же условии в WHERE выражение для этого клиента станет неизвестным, и строка исчезнет. Исключение возможно, если фильтр WHERE явно сохраняет отсутствующую правую часть, например WHERE o.status = 'paid' OR o.order_id IS NULL, но условие в ON обычно выражает намерение яснее. Пример кода Что использовать на практике Фильтруйте правые совпадения в ON. Это сохраняет все объекты левой таблицы. Фильтруйте итоговый набор в WHERE. Делайте так только когда действительно хотите исключить часть строк после соединения. Подводные камни Скрытый INNER JOIN. Условие WHERE o.status = 'paid' удалит клиентов без подходящего заказа. Проверка по nullable-по