Ответ
Ключевое отличие — этап выполнения запроса, на котором применяется фильтрация.
WHEREфильтрует строки перед группировкой (GROUP BY) и вычислением агрегатных функций. Он работает с отдельными записями исходных таблиц.HAVINGфильтрует результаты после группировки и вычисления агрегатных функций. Он работает с агрегированными значениями и сгруппированными строками.
Простой аналог: WHERE — это фильтр для сырых данных, HAVING — фильтр для сводного отчета.
Практические примеры:
-
WHEREс агрегацией: Найти среднюю зарплату по отделам, но только среди сотрудников с зарплатой > 5000.SELECT department, AVG(salary) as avg_salary FROM employees WHERE salary > 5000 -- Фильтрация КАЖДОГО сотрудника до группировки GROUP BY department; -
HAVINGс агрегацией: Найти отделы, где средняя зарплата превышает 7000.SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 7000; -- Фильтрация по РЕЗУЛЬТАТУ агрегации (avg_salary) -
Комбинирование
WHEREиHAVING: Найти отделы с более чем 5 сотрудниками, но учитывать только сотрудников, принятых после 2020 года.SELECT department, COUNT(*) as emp_count FROM employees WHERE hire_date > '2020-01-01' -- Сначала отфильтровать по дате GROUP BY department HAVING COUNT(*) > 5; -- Затем отфильтровать сгруппированные результаты
Важное правило: В условии HAVING можно использовать агрегатные функции (COUNT, SUM, AVG, MAX, MIN), а в WHERE — нет. Использование WHERE для первичной фильтрации данных обычно значительно повышает производительность запроса, так как сокращает объем данных для последующей группировки.
Видео-ответы
▶
▶
▶
▶
▶
▶