Агрегатные функции: COUNT, SUM, AVG, MIN, MAX
Содержание курса
В прошлом уроке функции вроде ROUND или LENGTH принимали одно значение и возвращали одно значение — каждая строка обрабатывалась независимо. Агрегатные функции работают иначе: они принимают сразу весь набор строк и сворачивают его в одно итоговое число.
Агрегатная функция: набор строк → одно итоговое значение
Представьте, что вам нужно узнать не содержимое конкретной строки, а что-то про всю таблицу целиком: сколько в ней заказов, какова их общая сумма, каков средний чек. Обычный SELECT здесь не поможет — он возвращает по одной строке на каждую запись. Агрегатная функция делает другое: она получает на вход множество строк и возвращает одно число.
Когда в SELECT стоят только агрегатные функции и нет GROUP BY, результат — всегда ровно одна строка. Не одна строка на каждый заказ, не пустой результат — именно одна строка с итоговыми значениями по всей таблице.
Пять основных функций выглядят так:
SELECT
COUNT(*) AS количество,
SUM(amount) AS итого,
AVG(amount) AS среднее,
MIN(amount) AS минимум,
MAX(amount) AS максимум
FROM orders;
Этот запрос вернёт одну строку с пятью столбцами. COUNT(*) — сколько строк в таблице. SUM(amount) — арифметическая сумма всех значений столбца amount. AVG(amount) — среднее арифметическое. MIN и MAX — наименьшее и наибольшее значение соответственно.
Почему именно одна строка? Потому что агрегатные функции в этом запросе описывают весь набор как единое целое. Пока мы считаем итог по всей таблице, в SELECT оставляйте только агрегатные выражения: тогда результатом будет одна строка. Как получить отдельный итог для каждой категории или клиента, разберём в следующем уроке.
Пять агрегатных функций на трёх строках
Запустите запрос целиком в SQLite или PostgreSQL. Временный набор orders содержит суммы 100, 300 и неизвестную сумму NULL:
WITH orders(amount) AS (
VALUES (100), (300), (NULL)
)
SELECT COUNT(*) AS rows_total,
COUNT(amount) AS amounts_known,
SUM(amount) AS total,
AVG(amount) AS average,
MIN(amount) AS smallest,
MAX(amount) AS largest
FROM orders;
Получится одна строка: 3 | 2 | 400 | 200 | 100 | 300. COUNT(*) увидел все три строки. Остальные функции использовали два известных значения: среднее равно 400 / 2, а не 400 / 3. Это различие пригодится при расчёте среднего чека по неполной выгрузке.
