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

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

Ответ

Агрегатная функция в SQL — это функция, которая выполняет вычисление над набором строк и возвращает единственное значение. Я постоянно использую их при работе с базами данных для анализа и суммирования данных.

Основные агрегатные функции, которые применяю чаще всего:

Функция Назначение Пример использования
COUNT() Подсчёт количества строк COUNT(*) — все строки, COUNT(column) — не-NULL значения
SUM() Сумма числовых значений SUM(price * quantity) для подсчёта общей стоимости
AVG() Среднее арифметическое AVG(rating) для средней оценки товара
MAX() Максимальное значение MAX(created_at) для последней записи
MIN() Минимальное значение MIN(price) для самой низкой цены
GROUP_CONCAT() Конкатенация строк (MySQL) GROUP_CONCAT(name SEPARATOR ', ') для списка

Практические примеры из моих проектов:

-- Анализ продаж за месяц
SELECT 
    product_id,
    COUNT(*) as orders_count,
    SUM(quantity) as total_quantity,
    SUM(price * quantity) as total_revenue,
    AVG(price) as average_price
FROM orders
WHERE order_date >= '2024-01-01' AND order_date < '2024-02-01'
GROUP BY product_id
HAVING total_revenue > 1000  -- Фильтрация после агрегации
ORDER BY total_revenue DESC;
-- Статистика по пользователям
SELECT 
    DATE(created_at) as signup_date,
    COUNT(*) as new_users,
    MIN(created_at) as first_signup,
    MAX(created_at) as last_signup
FROM users
GROUP BY DATE(created_at)
ORDER BY signup_date DESC;

Важные особенности работы с агрегатными функциями:

  1. Группировка с GROUP BY: Без GROUP BY агрегатные функции применяются ко всей таблице:

    -- Общая статистика по всей таблице
    SELECT 
        COUNT(*) as total_users,
        AVG(age) as average_age,
        MAX(last_login) as latest_login
    FROM users;
  2. Обработка NULL: Большинство агрегатных функций игнорируют NULL значения. COUNT(column) не считает NULL, AVG() их не учитывает.

  3. Фильтрация результатов: WHERE фильтрует строки до агрегации, HAVING — после:

    -- Только активные пользователи, сгруппированные по странам
    SELECT 
        country,
        COUNT(*) as active_users
    FROM users
    WHERE last_login > DATE_SUB(NOW(), INTERVAL 30 DAY)  -- До агрегации
    GROUP BY country
    HAVING active_users >= 10  -- После агрегации
  4. Вложенные агрегации в PHP: Иногда выполняю дополнительную агрегацию уже на стороне PHP:

    $stmt = $pdo->query("SELECT category, SUM(amount) as category_total FROM transactions GROUP BY category");
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Дополнительный расчёт на PHP
    $grandTotal = array_sum(array_column($results, 'category_total'));
    $averagePerCategory = $grandTotal / count($results);

Агрегатные функции — мощный инструмент для аналитических запросов, который позволяет получать сводные данные непосредственно на уровне базы данных, что обычно эффективнее, чем обработка всех строк в приложении.