Чем отличается WHERE от HAVING и в каком порядке выполняется SQL-запрос?
Как отвечать ▾Скрыть подсказку ▴
Как отвечать: Назовите логический порядок: FROM, JOIN, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT — и объясните, почему агрегаты нельзя фильтровать в WHERE.
Пример сильного ответа
WHERE фильтрует строки до группировки, поэтому агрегаты в нём использовать нельзя. HAVING работает уже после GROUP BY и отсекает группы по результатам функций. Логический порядок такой: FROM и JOIN, затем WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY и LIMIT — при этом SELECT выполняется позже WHERE, поэтому псевдоним из SELECT в WHERE недоступен. На практике мне приходилось переносить условие из HAVING в WHERE: отчёт по 40 миллионам строк ускорился примерно в десять раз, потому что агрегировалось заметно меньше данных.
- Показан именно порядок выполнения, а не только определения
- Есть практический кейс с переносом условия
- Цифры: 40 млн строк и ускорение в десять раз
Возьмите структуру и подставьте свой опыт — заученный чужой ответ интервьюер слышит сразу.