Ответ
Агрегатные функции (COUNT, SUM, AVG, MAX, MIN) почти всегда используются в комбинации с оператором GROUP BY, который группирует строки для вычислений. С этой связкой также часто применяются:
HAVING— для фильтрации результатов после агрегации (в отличие отWHERE, который фильтрует строки до).ORDER BY— для сортировки итоговых агрегированных данных.JOIN— для объединения данных из нескольких таблиц перед группировкой и агрегацией.
Пример SQL-запроса:
SELECT
department_id,
COUNT(*) AS employee_count,
AVG(salary) AS avg_salary
FROM employees
WHERE hire_date > '2020-01-01' -- Фильтрация ДО группировки
GROUP BY department_id -- Группировка по отделу
HAVING COUNT(*) > 3 -- Фильтрация ПОСЛЕ группировки
ORDER BY avg_salary DESC; -- Сортировка результата
Аналогия в Java Stream API:
Map<Department, Double> avgSalaryByDept = employees.stream()
.filter(e -> e.getHireDate().isAfter(LocalDate.of(2020, 1, 1)))
.collect(Collectors.groupingBy(
Employee::getDepartment, // Аналог GROUP BY
Collectors.averagingDouble(Employee::getSalary) // Аналог AVG()
));
// Дальнейшая фильтрация результата будет аналогом HAVING