Агрегатные функции
Учимся вычислять сводные показатели по всей таблице.
Агрегатная функция сворачивает множество строк в одно итоговое значение: количество, сумму, среднее, минимум или максимум.
Пять основных функций
До сих пор запросы возвращали строки как есть. Агрегатные функции считают по группе строк:
| Функция | Что считает |
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)считает число уникальных значений.