Агрегатные функции 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 агрегаты считаются по каждой группе отдельно.
Проверьте себя
1. Какая функция считает количество строк, игнорируя NULL в столбце?
ACOUNT(*)
BCOUNT(column)
CSUM(column)
DAVG(column)
2. Что вернёт AVG(salary), если в таблице 5 строк, но у одной salary = NULL?
AСреднее по 5 строкам (NULL считается как 0)
BNULL
CСреднее по 4 ненулевым строкам
DОшибку
3. Можно ли написать SELECT emp_name, COUNT(*) FROM employees без GROUP BY?
AДа, вернёт имя первого сотрудника и общее количество
BНет, это ошибка или неопределённый результат
CДа, вернёт все строки с одинаковым COUNT
DДа, если использовать псевдоним
4. Какой запрос найдёт максимальную зарплату в каждом отделе?
ASELECT MAX(salary) FROM employees
BSELECT dept_id, MAX(salary) FROM employees GROUP BY dept_id
CSELECT dept_id, MAX(salary) FROM employees ORDER BY dept_id
DSELECT dept_id, salary FROM employees WHERE salary = MAX(salary)
Поддержать проект