Ответ
Агрегатная функция в 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;
Важные особенности работы с агрегатными функциями:
-
Группировка с
GROUP BY: БезGROUP BYагрегатные функции применяются ко всей таблице:-- Общая статистика по всей таблице SELECT COUNT(*) as total_users, AVG(age) as average_age, MAX(last_login) as latest_login FROM users; -
Обработка NULL: Большинство агрегатных функций игнорируют NULL значения.
COUNT(column)не считает NULL,AVG()их не учитывает. -
Фильтрация результатов:
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 -- После агрегации -
Вложенные агрегации в 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);
Агрегатные функции — мощный инструмент для аналитических запросов, который позволяет получать сводные данные непосредственно на уровне базы данных, что обычно эффективнее, чем обработка всех строк в приложении.