Агрегатные функции COUNT, SUM, AVG, MIN, MAX
Агрегатные функции SQL: COUNT, SUM, AVG, MIN, MAX — как считать, суммировать и находить экстремумы в таблице.
Агрегатная функция принимает набор строк и возвращает одно значение. Она «сворачивает» таблицу или группу, превращая много строк в итог.
Таблица employees
Во всех примерах раздела используется демо-таблица employees:
SELECT * FROM employees;
Результат:
emp_id | emp_name | hire_date | salary | dept_id -------+---------------+------------+--------+-------- 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 2 | Tony Montana | 2002-07-15 | 6500 | 1 3 | Sarah Connor | 2005-10-18 | 8000 | 5 4 | Rick Deckard | 2007-01-03 | 7200 | 3 5 | Martin Blank | 2008-06-24 | 5600 | NULL
COUNT — количество строк
COUNT(*) считает все строки, включая строки с NULL. COUNT(column) считает только непустые значения столбца.
-- Сколько всего сотрудников?
SELECT COUNT(*) FROM employees;
Результат:
COUNT(*) -------- 5
-- Сколько сотрудников закреплено за каким-либо отделом?
-- (NULL в dept_id не считается)
SELECT COUNT(dept_id) FROM employees;
Результат:
COUNT(dept_id) -------------- 4
SUM — сумма
SUM складывает числовые значения столбца, игнорируя NULL.
-- Суммарный фонд зарплаты
SELECT SUM(salary) FROM employees;
Результат:
SUM(salary) ----------- 32300
AVG — среднее
AVG вычисляет среднее арифметическое ненулевых значений.
-- Средняя зарплата по компании
SELECT AVG(salary) FROM employees;
Результат:
AVG(salary) ----------- 6460.0
MIN и MAX — минимум и максимум
SELECT MIN(salary), MAX(salary) FROM employees;
Результат:
MIN(salary) | MAX(salary) ------------+------------ 5000 | 8000
Псевдонимы для удобства
Результаты агрегатов удобно именовать через AS:
SELECT
COUNT(*) AS total_employees,
ROUND(AVG(salary), 2) AS avg_salary,
MAX(salary) AS top_salary
FROM employees;
Результат:
total_employees | avg_salary | top_salary ----------------+------------+----------- 5 | 6460.0 | 8000
Агрегаты с GROUP BY
Чаще всего агрегаты применяют в паре с GROUP BY, чтобы получить итог по каждой группе:
-- Средняя зарплата по каждому отделу
SELECT dept_id, ROUND(AVG(salary), 0) AS avg_salary
FROM employees
WHERE dept_id IS NOT NULL
GROUP BY dept_id
ORDER BY avg_salary DESC;
Результат:
dept_id | avg_salary --------+----------- 5 | 8000 3 | 7200 1 | 6500 4 | 5000
Нельзя писать
SELECT emp_name, COUNT(*) FROM employeesбезGROUP BY— движок не знает, какое имя вывести для всей таблицы сразу.
Коротко
COUNT(*)— все строки;COUNT(col)— только не-NULL.SUM,AVG,MIN,MAX— математические агрегаты, NULL игнорируется.- Псевдонимы через
ASделают вывод читаемым. - С
GROUP BYагрегаты считаются по каждой группе отдельно.