В чем разница между HAVING и WHERE в SQL?

«В чем разница между HAVING и WHERE в SQL?» — вопрос из категории Базы данных, который задают на 52% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое отличие — этап выполнения запроса, на котором применяется фильтрация.

  • WHERE фильтрует строки перед группировкой (GROUP BY) и вычислением агрегатных функций. Он работает с отдельными записями исходных таблиц.
  • HAVING фильтрует результаты после группировки и вычисления агрегатных функций. Он работает с агрегированными значениями и сгруппированными строками.

Простой аналог: WHERE — это фильтр для сырых данных, HAVING — фильтр для сводного отчета.

Практические примеры:

  1. WHERE с агрегацией: Найти среднюю зарплату по отделам, но только среди сотрудников с зарплатой > 5000.

    SELECT department, AVG(salary) as avg_salary
    FROM employees
    WHERE salary > 5000          -- Фильтрация КАЖДОГО сотрудника до группировки
    GROUP BY department;
  2. HAVING с агрегацией: Найти отделы, где средняя зарплата превышает 7000.

    SELECT department, AVG(salary) as avg_salary
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 7000;   -- Фильтрация по РЕЗУЛЬТАТУ агрегации (avg_salary)
  3. Комбинирование 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 для первичной фильтрации данных обычно значительно повышает производительность запроса, так как сокращает объем данных для последующей группировки.