Чтобы найти отделы с более чем пятью сотрудниками, нам нужно агрегировать записи сотрудников по отделам и затем отфильтровать сгруппированные результаты на основе условия подсчёта.
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;
GROUP BY department_id — группирует все строки сотрудников по их отделу, так что каждый отдел становится одной строкой результатаCOUNT(*) — подсчитывает общее количество сотрудников в каждой группеHAVING COUNT(*) > 5 — исключает любой отдел, в котором количество сотрудников пять или меньшеЭто принципиальное различие:
WHERE фильтрует отдельные строки до того, как происходит группировкаHAVING фильтрует сгруппированные результаты после применения агрегацииПоскольку мы фильтруем на основе агрегированного значения (COUNT(*)), HAVING — это правильный вариант в данном случае. Использование WHERE с агрегирующей функцией вызовет синтаксическую ошибку.
Запрос возвращает два столбца:
department_id — идентификатор каждого подходящего отделаemp_count — общее количество сотрудников в этом отделеClause HAVING используется в этом запросе потому, что она фильтрует сгруппированные результаты на основе агрегирующих функций, в то время как WHERE фильтровала бы отдельные строки до агрегирования.
Новый — ещё не проверен сообществом
Вы