Составьте SQL запрос с JOIN, который выводит всех клиентов и их заказы, включая клиентов без заказов
Что проверяют
Базовый SQL и понимание NULL. Для тестировщика это рабочий инструмент: посмотреть, что реально записалось в базу после действия в интерфейсе, и отличить «заказов нет» от «клиент не подтянулся».
Как отвечать
Нужен LEFT JOIN от таблицы клиентов: он оставляет все строки левой таблицы, а для клиентов без заказов подставляет NULL в колонки правой.
select c.id, c.name, o.id as order_id, o.created_at
from clients c
left join orders o on o.client_id = c.id
order by c.id;Сразу проговорите, что клиент с тремя заказами даст три строки: это нормальное поведение соединения, но если нужна ровно одна строка на клиента, добавляется агрегация.
select c.id, c.name, count(o.id) as orders_count
from clients c
left join orders o on o.client_id = c.id
group by c.id, c.name;Здесь важен count(o.id), а не count(*): второй считает строки, включая строку-заглушку, и у клиента без заказов покажет единицу. Полезно знать и обратную задачу: только клиенты без заказов получаются антисоединением, left join плюс where o.id is null или not exists.
Где спотыкаются
Дописывают условие на правую таблицу в where. Фильтр вида where o.status = 'paid' отбрасывает строки с NULL, и LEFT JOIN незаметно превращается в INNER JOIN, а клиенты без заказов исчезают. Такое условие идёт в on.
Используют count(*) вместо счёта по колонке правой таблицы и получают единицу там, где должен быть ноль. Ошибка тихая: запрос отрабатывает, цифры выглядят правдоподобно.
Сравнивают с NULL через равенство. Условие where o.id = null не вернёт ничего, нужен is null. Рядом живёт вторая путаница: меняют LEFT на RIGHT, не поменяв порядок таблиц, и получают ровно противоположную выборку.