← Назад к вопросам

Что такое агрегатная функция?

1.2 Junior🔥 172 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое агрегатная функция?

Агрегатная функция — это функция, которая выполняет вычисление над набором значений (например, строками в таблице БД или элементами массива) и возвращает единственное итоговое значение. Ключевая особенность: она «агрегирует» (объединяет, сводит) множество входных данных в один скалярный результат, часто используемый в сводных отчётах, аналитике или итоговых вычислениях.

Основные агрегатные функции в SQL

В контексте работы с базами данных (особенно для PHP Backend) наиболее распространены:

  • COUNT() — подсчитывает количество строк (или ненулевых значений).
  • SUM() — вычисляет сумму значений в столбце.
  • AVG() — вычисляет среднее арифметическое значений.
  • MIN() — находит минимальное значение.
  • MAX() — находит максимальное значение.
  • GROUP_CONCAT() (MySQL) — объединяет строковые значения из группы в одну строку.

Агрегатные функции почти всегда используются вместе с предложением GROUP BY для разделения данных на группы и применения вычислений к каждой группе отдельно.

Примеры в SQL

-- Общее количество пользователей в системе
SELECT COUNT(*) AS total_users FROM users;

-- Сумма и средний чек всех заказов
SELECT SUM(amount) AS total_revenue, AVG(amount) AS avg_order_amount FROM orders;

-- Количество заказов и общая выручка по каждому клиенту (группировка)
SELECT customer_id, COUNT(*) AS order_count, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id;

Агрегатные функции в PHP

В PHP агрегации часто выполняются над массивами с помощью встроенных функций или циклов. Хотя они не носят строго формального названия «агрегатных», логически выполняют ту же роль.

<?php
$prices = [100, 250, 300, 150];

// Аналог SUM()
$total = array_sum($prices); // Результат: 800

// Аналог AVG()
$average = $total / count($prices); // Результат: 200

// Аналог MIN() и MAX()
$minPrice = min($prices); // 100
$maxPrice = max($prices); // 300

// Аналог COUNT() (подсчёт по условию — агрегация с фильтрацией)
$expensiveCount = array_reduce($prices, fn($carry, $price) => $carry + ($price > 200 ? 1 : 0), 0);
// Результат: 2 (элементы 250 и 300)
?>

Важные особенности с точки зрения Backend-разработки

  1. Производительность и декларативность: В SQL агрегатные функции позволяют выполнять вычисления на стороне СУБД, что почти всегда эффективнее, чем выборка всех строк и агрегация в коде PHP. СУБД оптимизирует эти операции, используя индексы.
    -- Эффективно: СУБД посчитает только один агрегат
    SELECT AVG(salary) FROM employees WHERE department_id = 5;
    
    // Менее эффективно (гипотетический пример): выборка всех данных в PHP
    $salaries = $pdo->query("SELECT salary FROM employees WHERE department_id = 5")->fetchAll(PDO::FETCH_COLUMN);
    $average = array_sum($salaries) / count($salaries);
    
  2. Группировка (GROUP BY) и фильтрация (HAVING): HAVING — это аналог WHERE, но для условий, применяемых после агрегации.
    -- Найти отделы с бюджетом на ЗП больше 50000
    SELECT department_id, SUM(salary) AS total_salary
    FROM employees
    GROUP BY department_id
    HAVING total_salary > 50000;
    
  3. Обработка NULL: Большинство агрегатных функций (кроме COUNT(*)) игнорируют значения NULL. Например, AVG() вычисляет среднее только по не-NULL значениям.
  4. Контекст ORM (Eloquent, Doctrine): Использование агрегатных функций через ORM позволяет писать безопасный, выразительный код, близкий к SQL.
    // Пример в Laravel Eloquent
    $averagePrice = Order::where('status', 'completed')->avg('amount');
    $departmentStats = Employee::groupBy('department_id')
                               ->selectRaw('department_id, COUNT(*) as emp_count, AVG(salary) as avg_salary')
                               ->get();
    

Итог: Для backend-разработчика понимание агрегатных функций — это критически важный навык для эффективной работы с данными. Их правильное использование напрямую влияет на:

  • Производительность приложений (перенос вычислений в СУБД),
  • Корректность аналитики и отчётов,
  • Читаемость и лаконичность кода запросов.

Оптимальная стратегия — стремиться выполнять агрегацию на уровне базы данных, а в PHP уже работать с готовыми итоговыми значениями или небольшими агрегированными наборами данных.