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

«В чем разница между HAVING и WHERE в SQL?» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

Примеры:

-- WHERE: выбираем только сотрудников с зарплатой > 50000, а затем группируем
SELECT department, AVG(salary)
FROM employees
WHERE salary > 50000
GROUP BY department;

-- HAVING: сначала группируем по отделам, затем оставляем только те, где средняя зарплата > 70000
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 70000;

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

  1. WHERE не может использовать агрегатные функции (как AVG(salary) в условии), HAVING — может.
  2. Использование WHERE для первичной фильтрации данных обычно эффективнее, так как сокращает объем данных, поступающих на этап группировки.