Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников

57. Показать разницу между WHERE и HAVING

Условие задачи:
Необходимо привести реалистичный SQL-пример, в котором одновременно используются WHERE и HAVING, и показать разницу между ними.

WHERE должен фильтровать отдельные строки до группировки, а HAVING — получившиеся группы после GROUP BY.


Спойлеры к решению

Подсказки
💡 WHERE применяется до GROUP BY и отбрасывает отдельные строки.
💡 HAVING применяется к уже сформированным группам.
💡 Например, можно учитывать только активных сотрудников, а затем оставить отделы с высокой средней зарплатой и достаточным количеством сотрудников.

Решение

Предположим, есть таблица employees с колонками department_id, salary и status.

SELECT
    department_id,
    AVG(salary) AS avg_salary,
    COUNT(*) AS employee_count
FROM employees
WHERE status = 'ACTIVE'
GROUP BY department_id
HAVING AVG(salary) > 50000
   AND COUNT(*) >= 3;

Условие:

WHERE status = 'ACTIVE'

срабатывает до группировки и оставляет только активных сотрудников.

Затем:

GROUP BY department_id

объединяет оставшиеся строки по отделам.

После вычисления агрегатов:

HAVING AVG(salary) > 50000
   AND COUNT(*) >= 3

оставляет только те отделы, где среди активных сотрудников:

  • средняя зарплата превышает 50000;

  • количество сотрудников не меньше трёх.

Главное отличие:

WHERE  — фильтрует строки до GROUP BY
HAVING — фильтрует группы после GROUP BY

Именно поэтому условие по обычному полю status естественно задавать через WHERE, а условия по AVG() и COUNT() — через HAVING.