Групповые функции работают с группами строк и возвращают один результат на каждую группу строк. При использовании групповых функций команда SELECT может включать предложения GROUP BY и HAVING. Команда имеет при этом следующий синтаксис:
SELECT столбец|выражение, …
FROM таблица, …
[WHERE условие]
[GROUP BY выражение_группирования]
[HAVING условие_включения_группы]
[ORDER BY столбец | выражение, … ];
где:
предложение GROUP BY | группирует выбираемые строки на основе значения заданного выражения_группирования; |
предложение HAVING | ограничивает множество групп возвращаемых строк условием_включения_группы. В результат попадают только те группы, для которых условие истинно. |
Групповые функции могут появляться в предложениях SELECT и HAVING. В случае, если в предложении SELECT встречается групповая функция, а предложение GROUP BY отсутствует, то групповая функция вычисляется для всего множества строк таблицы. Если предложение GROUP BY включено, то строки таблицы разбиваются на группы по значению выражения, указанного в предложении GROUP BY, и значение групповой функции вычисляется для каждой такой группы строк
|
|
В следующей таблице перечислены некоторые из групповых функций.
Функция | Описание |
AVG([DISTINCT | ALL ] n) | Возвращает среднее значение n. |
COUNT(* | [DISTINCT| ALL ] выражение) | Возвращает количество строк в запросе. Если указано выражение, подсчитываются только те строки, в которых значение выражения не пусто. Если указана *, то подсчитываются все строки, включая повторяющиеся и строки с неопределенными значениями. |
MAX([DISTINCT | ALL ] выражение) | Возвращает максимальное значение выражения. |
MIN([DISTINCT | ALL ] выражение) | Возвращает минимальное значение выражения. |
STDDEV([DISTINCT | ALL ] n) | Возвращает стандартное отклонение n. Вычисляется как квадратный корень из дисперсии, определяемой групповой функцией VARIANCE. |
SUM([DISTINCT | ALL ] n) | Возвращает сумму значений n. |
VARIANCE([DISTINCT | ALL ] n) | Возвращает дисперсию n. Дисперсия вычисляется по следующей формуле: (S(ni2)-1/k*(S(ni))2)/(n-1), где ni – один из элементов множества n, k – число элементов, а сумма берется по всему множеству n. При k=1 дисперсия считается равной 0. |
Каждая групповая функция допускает один аргумент. Многие групповые функции принимают опции ALL и DISTINCT. Если задана опция DISTINCT, групповая функция учитывает лишь неповторяющиеся значения своего аргумента. Если задана опция ALL (используется по умолчанию) – групповая функция учитывает все значения, включая повторения. Например, среднее значение чисел 1,1,1,3 с опцией DISTINCT – (1+3)/2=2, а с опцией ALL – (1+1+1+3)/4=1.5.
Все групповые функции, за исключением COUNT(*), игнорируют пустые значения. Для подстановки значения вместо пустого используйте функцию NVL. Если запрос с групповой функцией не возвращает ни одной строки, или возвращает лишь такие строки, которые содержат пустые значения аргумента групповой функции, то групповая функция возвращает NULL.
|
|
Функции AVG, SUM, STDDEV и VARIANCE могут применяться только к столбцам с числовыми данными, а функции MAX, MIN и COUNT – к столбцам любого типа.
Пример: Вывести минимальную, максимальную и среднюю зарплату по все служащим.
Так как требуется произвести расчет по всем служащим (то есть по всем строкам таблицы), предложение GROUP BY не используется.
SELECT MIN(salary), MAX(salary), AVG(salary)
FROM s_emp;
Результат:
MIN(SALARY) MAX(SALARY) AVG(SALARY)
----------- ----------- -----------
750 2500 1255,08
Пример: Вывести первую фамилию из алфавитного списка служащих.
SELECT MIN(last_name)
FROM s_emp;
Результат:
MIN(LAST_NAME)
----------------
Biri
Пример: Узнать общее количество служащих и количество служащих, получающих комиссионные.
В данном примере COUNT(*) подсчитает общее количество строк таблицы (то есть общее количество служащих). COUNT(commission_pct) подсчитает количество тех строк, в которых значение столбца commission_pct не пусто, то есть служащих, получающих комиссионные.
SELECT COUNT(*), COUNT(commission_pct)
FROM s_emp;
Результат:
COUNT(*) COUNT(COMMISSION_PCT)
--------- ---------------------
25 5