SQL позволяет работать не только с отдельными строками, но и производить аналитику по всем строкам или по группе строк. Функции, возвращающие единственное значение для набора строк, называются агрегатными.
В большинстве задач можно обойтись следующим джентельменским набором агрегатных функций:
avg(выражение)- арифметическое среднее;min(выражение)- минимальное значение выражения;max(выражение)- маскимальное значение выражения;sum(выражение)- сумма значений выражения;count(*)- количество строк в результате запроса;count(выражение)- количество значений выражения, не равныхNULL.
Если в SQL запросе не используется GROUP BY, то значение агрегатной функции вычисляется по всем строкам, полученным в результате выполнения инструкций FROM и WHERE.
Чтобы вызвать агрегатную функцию необходимо указать ее в списке выборки (после SELECT). Если в SELECT использована хотя бы одна агрегатная функция, то значениями других столбцов могут быть только вызовы агрегатных функций, либо константы. Попробуем воспользоваться агрегатными функциями на следующей таблице:
SELECT *
FROM table1
| value |
|---|
| 1 |
| 2 |
| 3 |
| NULL |
SELECT avg(value),
min(value),
max(value),
sum(value),
count(*) as count_total,
count(value) as count_value
FROM table1
| avg | min | max | sum | count_total | count_value |
|---|---|---|---|---|---|
| 2 | 1 | 3 | 6 | 4 | 3 |
При попытке вызова агрегатной функции вместе с выводом столбца таблицы в списке выборки возникнет ошибка:
SELECT product_id,
max(count)
FROM purchase_item
column "purchase_item.product_id" must appear in the GROUP BY clause or be used in an aggregate function
И это логично. Агрегатная функция должна вернуть одно значение на весь набор данных (в нашем запросе одну строку), а какое значение product_id взять из всех строк? Помимо агрегатных функций есть еще аналитические функции, которые не изменяют количество строк в результате выборки, но при этом позволяют вычислять значения по набору строк. С ними мы познакомимся позднее.