Агрегатные функции

Учимся вычислять сводные показатели по всей таблице.

Агрегатная функция сворачивает множество строк в одно итоговое значение: количество, сумму, среднее, минимум или максимум.

Пять основных функций

До сих пор запросы возвращали строки как есть. Агрегатные функции считают по группе строк:

ФункцияЧто считает
COUNT(*)число строк
SUM(x)сумму значений
AVG(x)среднее значение
MIN(x)наименьшее значение
MAX(x)наибольшее значение

Посчитаем все пять показателей по таблице продаж сразу:

CREATE TABLE sales (id INTEGER PRIMARY KEY, product TEXT, amount INTEGER);

INSERT INTO sales (product, amount) VALUES
    ('Книга', 500), ('Книга', 300),
    ('Ручка',  50), ('Ручка',  70), ('Тетрадь', 120);

SELECT COUNT(*)   AS строк,
       SUM(amount) AS сумма,
       AVG(amount) AS среднее,
       MIN(amount) AS минимум,
       MAX(amount) AS максимум
FROM sales;

Вывод:

5|1040|208.0|50|500

Весь набор из пяти строк свернулся в одну строку с итогами. Среднее AVG возвращается как вещественное число (208.0), даже если данные целые.

COUNT(*) против COUNT(столбец)

Между этими формами есть важная разница: COUNT(*) считает все строки, а COUNT(столбец) — только строки, где этот столбец не NULL. Это удобно, чтобы посчитать, у скольких записей заполнено поле.

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, phone TEXT);

INSERT INTO users (name, phone) VALUES
    ('Аня', '+7900'), ('Борис', NULL), ('Вера', NULL);

SELECT COUNT(*)     AS всего,
       COUNT(phone) AS с_телефоном
FROM users;

Вывод:

3|1

Всего три пользователя, но телефон указан только у одного — остальные NULL и в COUNT(phone) не попали. Так же SUM, AVG, MIN, MAX игнорируют NULL.

COUNT(DISTINCT ...)

Можно посчитать число уникальных значений, добавив DISTINCT. Например, сколько разных товаров продавалось:

CREATE TABLE sales (id INTEGER PRIMARY KEY, product TEXT);

INSERT INTO sales (product) VALUES ('Книга'), ('Книга'), ('Ручка'), ('Тетрадь');

SELECT COUNT(DISTINCT product) AS видов_товара FROM sales;

Вывод:

3

Строк четыре, но разных товаров — три («Книга» повторилась).

Итог

  • Агрегатные функции (COUNT, SUM, AVG, MIN, MAX) сворачивают строки в одно значение.
  • COUNT(*) считает все строки, COUNT(столбец) — только ненулевые; NULL игнорируется и в SUM/AVG/MIN/MAX.
  • COUNT(DISTINCT x) считает число уникальных значений.
Проверьте себя
1. Чем COUNT(*) отличается от COUNT(phone)?
AНичем
BCOUNT(*) считает все строки, COUNT(phone) — только строки, где phone не NULL
CCOUNT(phone) считает уникальные значения
DCOUNT(*) работает только без WHERE
2. В каком виде AVG обычно возвращает результат для целых данных?
AВсегда целое
BКак вещественное число (например, 208.0)
CКак текст
DКак NULL
3. Что вернёт COUNT(DISTINCT product), если есть строки 'Книга','Книга','Ручка','Тетрадь'?
A4
B3
C2
D1
Поддержать проект