Вступить в клуб →
средняявопросSQL и оптимизация запросов

LEFT JOIN, после которого пропали клиенты без заказов

Нужен список всех клиентов с их оплаченными заказами, включая тех, у кого оплаченных заказов нет. Написали так:

SELECT c.id, c.name, o.id AS order_id
FROM clients c
LEFT JOIN orders o ON o.client_id = c.id
WHERE o.status = 'paid';

В результате клиенты без оплаченных заказов в выдачу не попали. Почему?

  • LEFT JOIN не сохраняет строки, если в правой таблице в колонке status оказывается NULL; чтобы вернуть клиентов без заказов, соединение меняют на RIGHT JOIN
  • Не хватает GROUP BY c.id: без группировки строки клиентов без заказов схлопываются с дубликатами и не попадают в выдачу
  • Для клиентов без оплаченных заказов o.status равен NULL, и условие в WHERE их отбрасывает — LEFT JOIN фактически превращается в INNER; условие по правой таблице нужно перенести в ON
  • Неверно выбран порядок таблиц во FROM: при LEFT JOIN таблица, по которой идёт фильтрация в WHERE, должна стоять первой, иначе строки теряются

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела