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
взять из всех строк? Помимо агрегатных функций есть еще аналитические функции, которые не изменяют количество строк в результате выборки, но при этом позволяют вычислять значения по набору строк. С ними мы познакомимся позднее.