Вопрос проверяет понимание логического порядка выполнения SQL-запроса и умение корректно писать агрегатные запросы.
SQL-запрос выполняется не в том порядке, в котором он написан. Сначала фильтруются строки через WHERE, затем происходит группировка GROUP BY. После этого применяется фильтрация по агрегатам через HAVING. В самом конце результат сортируется с помощью ORDER BY.
Чтобы корректно писать сложные SQL-запросы, важно понимать логический порядок их выполнения, а не только синтаксис.
Определение:
Логический порядок выполнения — это этапы, через которые проходит запрос внутри СУБД, независимо от порядка ключевых слов в тексте запроса.
Основные этапы:
FROM
определяется источник данных
формируется набор строк
WHERE
фильтрация строк до агрегации
агрегатные функции здесь недоступны
GROUP BY
строки объединяются в группы
подготавливается основа для агрегатных функций
HAVING
фильтрация уже сгруппированных данных
используется для условий по агрегатам
SELECT
вычисляются выражения
формируется итоговый набор колонок
ORDER BY
сортировка итогового результата
SELECT user_id, COUNT(*)
FROM orders
WHERE status = 'PAID'
GROUP BY user_id
HAVING COUNT(*) > 5
ORDER BY COUNT(*) DESC;
Как читается логически:
сначала берутся только оплаченные заказы
затем они группируются по пользователю
потом отбираются пользователи с более чем 5 заказами
в конце результат сортируется
попытка использовать агрегатные функции в WHERE
ожидание, что ORDER BY повлияет на агрегацию
WHERE фильтрует строки до группировки, HAVING — после нее, а ORDER BY всегда применяется последним.