COUNT, SUM, AVG, MIN, MAX
Пять главных агрегатных функций. Разберём каждую с примерами.
COUNT, количество строк
-- Сколько всего пользователей
SELECT COUNT(*) FROM users;
-- Сколько пользователей с email (NULL не считается!)
SELECT COUNT(email) FROM users;
-- Сколько уникальных городов
SELECT COUNT(DISTINCT city) FROM users;
COUNT(*) vs COUNT(column): COUNT(*) считает все строки включая NULL. COUNT(column), только строки где column не NULL.
SUM, сумма
-- Общая выручка
SELECT SUM(amount) FROM orders;
-- Выручка за январь
SELECT SUM(amount)
FROM orders
WHERE created_at >= '2024-01-01'
AND created_at < '2024-02-01';
-- Округление результата
SELECT ROUND(SUM(amount), 2) AS total FROM orders;
AVG, среднее значение
-- Средний возраст
SELECT AVG(age) FROM users;
-- Средний чек (округлённый)
SELECT ROUND(AVG(amount), 2) AS avg_order FROM orders;
AVG тоже игнорирует NULL, считает среднее только по непустым значениям.
MIN и MAX, минимум и максимум
-- Самый молодой и старший
SELECT MIN(age) AS youngest, MAX(age) AS oldest
FROM users;
-- Первый и последний заказ
SELECT MIN(created_at) AS first, MAX(created_at) AS last
FROM orders;
-- Диапазон цен
SELECT MIN(price) AS min_price, MAX(price) AS max_price
FROM products;
Комбинируем агрегаты
Можно использовать несколько агрегатов в одном запросе:
SELECT
COUNT(*) AS total_orders,
COUNT(DISTINCT customer_id) AS unique_customers,
SUM(amount) AS total_revenue,
ROUND(AVG(amount), 0) AS avg_order,
MIN(amount) AS min_order,
MAX(amount) AS max_order
FROM orders
WHERE status = 'completed';
Результат, одна строка с полной статистикой по завершённым заказам.
total_orders | unique_customers | total_revenue | avg_order | min_order | max_order
-------------+-----------------+---------------+-----------+-----------+-----------
1250 | 487 | 3 456 789 | 2765 | 99 | 89000
💡 Главная мысль: Пять функций покрывают большинство аналитических задач. COUNT считает строки, SUM суммирует, AVG усредняет, MIN/MAX находят крайние значения. Все они игнорируют NULL.