Какова разница между операторами SQL WHERE и HAVING?

Ответ

Операторы WHERE и HAVING в SQL используются для фильтрации данных, но применяются на разных этапах выполнения запроса и имеют разные области действия.

  • WHERE: Фильтрует отдельные строки до того, как они будут сгруппированы оператором GROUP BY. Он применяется к исходным данным и не может использовать агрегатные функции (такие как COUNT, SUM, AVG, MAX, MIN). Использование WHERE на этом этапе более эффективно, так как уменьшает объем данных, которые затем будут группироваться.

  • HAVING: Фильтрует группы строк после того, как они были сформированы оператором GROUP BY. Он применяется к результатам агрегатных функций и может использовать их в своих условиях.

Пример:

-- Выбрать отделы, где средняя зарплата сотрудников, получающих более 50000, превышает 60000
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000 -- Фильтрация отдельных сотрудников до группировки
GROUP BY department
HAVING AVG(salary) > 60000; -- Фильтрация групп по агрегированному значению

Ключевые отличия:

  1. Этап применения: WHERE — до GROUP BY; HAVING — после GROUP BY.
  2. Объект фильтрации: WHERE — отдельные строки; HAVING — группы строк.
  3. Использование агрегатных функций: WHERE — нет; HAVING — да.
  4. Эффективность: WHERE более эффективен для первичной фильтрации, так как сокращает объем данных для дальнейшей обработки.