Какие операторы SQL часто используются вместе с агрегатными функциями?

«Какие операторы SQL часто используются вместе с агрегатными функциями?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Агрегатные функции (COUNT, SUM, AVG, MAX, MIN) почти всегда используются в комбинации с оператором GROUP BY, который группирует строки для вычислений. С этой связкой также часто применяются:

  1. HAVING — для фильтрации результатов после агрегации (в отличие от WHERE, который фильтрует строки до).
  2. ORDER BY — для сортировки итоговых агрегированных данных.
  3. 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