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.