Агрегатные функции
Агрегатные функции выполняют вычисление на наборе значений и возвращают
одиночное значение. Агрегатные функции, за исключением COUNT, не
учитывают значения NULL и часто используются совместно с предложением
GROUP BY в сложных аналитических запросах.
Общий синтаксис для использования агрегатных функций
<агрегатная функция>([ALL | DISTINCT] <выражение>)
Выражение может содержать столбец таблицы, константу, переменную, выражение, неагрегатную или пользовательскую функцию, которая возвращает числовой тип данных. Агрегатные функции в качестве выражения не допускаются.
Параметр ALL применяет агрегатную функцию ко всем значениям. ALL
является параметром по умолчанию. Параметр DISTINCT указывает на то,
что функция AVG будет выполнена только для одного экземпляра каждого
уникального значения, независимо от того, сколько раз встречается это
значение.
Основные агрегатные функции:
COUNT()— подсчитывает количество строк.SUM()— вычисляет сумму значений.AVG()— вычисляет среднее значение.MIN()— находит минимальное значение.MAX()— находит максимальное значение.LIST()— выполняет конкатенацию строк аргументов.
Рассмотрим примеры использования агрегатных функций.
COUNT()
Подсчитывает количество строк группы.
Например, найдем общее количество сотрудников.
SELECT COUNT(*) AS TOTAL_EMPLOYEES
FROM EMPLOYEES;
Результат:
| total_employees |
|---|
| 5 |
Найдем количество сотрудников в отделе D01.
SELECT COUNT(*) AS EMPLOYEES_IN_D01
FROM EMPLOYEES
WHERE DEPT_NO = 'D01';
Результат:
| employees_in_d01 |
|---|
| 2 |
SUM()
Вычисляет сумму значений в столбце.
Найдем общую сумму зарплат всех сотрудников.
SELECT SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEES;
Результат:
| total_salary |
|---|
| 280000.00 |
Найдем сумму зарплат в отделе D02.
SELECT SUM(SALARY) AS TOTAL_SALARY_D02
FROM EMPLOYEES
WHERE DEPT_NO = 'D02';
| total_salary_d02 |
|---|
| 130000.00 |
AVG()
Вычисляет среднее значение в столбце.
Найдем среднюю зарплату всех сотрудников.
SELECT AVG(SALARY) AS AVG_SALARY
FROM EMPLOYEES;
Результат:
| avg_salary |
|---|
| 56000.00 |
Найдем среднюю зарплату в отделе D01.
SELECT AVG(SALARY) AS AVG_SALARY_D01
FROM EMPLOYEES
WHERE DEPT_NO = 'D01';
Результат:
| avg_salary_d01 |
|---|
| 52500.00 |
MIN()
Находит минимальное значение в столбце.
Найдем минимальную зарплату среди всех сотрудников.
SELECT MIN(SALARY) AS MIN_SALARY
FROM EMPLOYEES;
Результат:
| min_salary |
|---|
| 45000.00 |
Найдем минимальную зарплату в отделе D02.
SELECT MIN(SALARY) AS MIN_SALARY_D02
FROM EMPLOYEES
WHERE DEPT_NO = 'D02';
Результат:
| min_salary_d02 |
|---|
| 60000.00 |
MAX()
Находит максимальное значение в столбце.
Найдем максимальную зарплату среди всех сотрудников.
SELECT MAX(SALARY) AS MAX_SALARY
FROM EMPLOYEES;
Результат:
| max_salary |
|---|
| 70000.00 |
Найдем максимальную зарплату в отделе D01.
SELECT MAX(SALARY) AS MAX_SALARY_D01
FROM EMPLOYEES
WHERE DEPT_NO = 'D01';
Результат:
| max_salary_d01 |
|---|
| 55000.00 |
LIST
Функция имеет параметр, который можно указать через запятую
LIST([ALL | DISTINCT] <выражение> [, <разделитель>])
Разделитель - выражение строкового типа. По умолчанию разделителем является запятая.
Функция LIST возвращает строку, содержащую значения элементов выборки,
которые не равны NULL. При пустой выборке функция возвратит NULL.
Порядок конкатенации строк определяется порядком чтения записей из
источников, который в общем случае не определён. Для придания списку
необходимого порядка вы можете предварительно упорядочить источник
данных, например с помощью производной таблицы.
Получим все страны в одной строке.
SELECT LIST(COUNTRY)
FROM COUNTRY;
Результат:
| LIST |
|---|
| ‘USA,England,Canada,Switzerland,Japan,Italy,France,Germany,Australia,Hong Kong,Netherlands,Belgium,Austria,Fiji,Russia,Romania’ |
Добавим пробел после разделяющей запятой.
SELECT LIST(COUNTRY)
FROM COUNTRY;
Результат:
| LIST |
|---|
| ‘USA, England, Canada, Switzerland, Japan, Italy, France, Germany, Australia, Hong Kong, Netherlands, Belgium, Austria, Fiji, Russia, Romania’ |
Выберем все валюты, используемые в указанных странах, исключим дубликаты.
SELECT LIST(DISTINCT CURRENCY, ', ')
FROM COUNTRY;
Результат:
| LIST |
|---|
| ‘ADollar, CdnDlr, Dollar, Euro, FDollar, HKDollar, Pound, RLeu, Ruble, SFranc, Yen’ |
Примеры с GROUP BY
Агрегатные функции часто используются вместе с предложением GROUP BY. Они вычисляют значения не на основании значений столбца из всех строк таблицы, а на основании значений столбца для записей, входящих в определенную группу. Напомним, что в группу входят записи, в одинаковым значением столбцов из списка группировки.
Количество сотрудников в каждом отделе:
SELECT DEPT_NO, COUNT(*) AS EMPLOYEE_COUNT
FROM EMPLOYEES
GROUP BY DEPT_NO;
Результат:
| DEPT_NO | EMPLOYEE_COUNT |
|---|---|
| D01 | 2 |
| D02 | 2 |
| D03 | 1 |
Средняя зарплата в каждом отделе:
SELECT DEPT_NO, AVG(SALARY) AS AVG_SALARY
FROM EMPLOYEES
GROUP BY DEPT_NO;
Результат:
| DEPT_NO | AVG_SALARY |
|---|---|
| D01 | 52500.00 |
| D02 | 65000.00 |
| D03 | 45000.00 |
Максимальная зарплата по должностям:
SELECT JOB_TITLE, MAX(SALARY) AS MAX_SALARY
FROM EMPLOYEES
GROUP BY JOB_TITLE;
Результат:
| JOB_TITLE | MAX_SALARY |
|---|---|
| МЕНЕДЖЕР | 50000.00 |
| АНАЛИТИК | 70000.00 |
| РАЗРАБОТЧИК | 55000.00 |
Контрольные вопросы
- Что представляют собой агрегатные функции?
- Как обрабатываются
NULLзначения в агрегатных функциях? - Для чего используется опция
DISTINCT? - Назовите основные агрегатные функции?
- Какие особенности есть у агрегатной функции
COUNT? - Какие особенности есть у агрегатной функции
LIST?