Вступить в клуб →
лёгкаявопросSQL и проверка данных

Условие на количество заявок в группе перенесли из HAVING в WHERE

Нужен список статусов, по которым заявок больше 40. Рабочий запрос выглядит так:

SELECT status, COUNT(*) AS cnt
FROM tickets
GROUP BY status
HAVING COUNT(*) > 40;

Коллега предлагает переписать его и перенести условие в WHERE:

SELECT status, COUNT(*) AS cnt
FROM tickets
WHERE COUNT(*) > 40
GROUP BY status;

Что получится?

  • Запрос не выполнится: WHERE отбирает строки до группировки, когда агрегат ещё не посчитан, поэтому условие на COUNT(*) ставится в HAVING
  • Результат не изменится: WHERE и HAVING различаются только местом в тексте запроса, а СУБД сама решает, на каком этапе применить условие к агрегату
  • Запрос вернёт все статусы без исключения: условие с агрегатом в WHERE считается заведомо истинным и просто отбрасывается оптимизатором при разборе
  • Запрос отфильтрует отдельные заявки: в выборку попадут только те строки, у которых значение счётчика внутри своей группы оказалось больше сорока

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

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

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

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