Обобщение данных с помощью агрегатных функций
В ЭТОЙ ГЛАВЕ ВЫ ПЕРЕЙДЕТЕ ОТ ПРОСТОГО использования запросов к извлечению значений из базы данных и определению, как вы можете использовать эти значения, чтобы получить из них информацию. Это делается с помощью агрегатных или общих функций, которые берут группы значений из поля и сводят их до одиночного значения. Вы узнаете, как использовать эти функции, как определить группы значений, к которым они будут применяться, и как определить, какие группы выбираются для вывода. Вы будете также видеть, при каких условиях вы сможете объединить значения поля с этой полученной информацией в одиночном запросе.
Что такое агрегатные функции?
Запросы могут производить обобщенное групповое значение полей точно также как и значение одного поля. Это делает с помощью агрегатных функций. Агрегатные функции производят одиночное значение для всей группы таблицы. Имеется список этих функций:
COUNT производит номера строк или не NULL значения полей, которые выбрал запрос.
SUM производит арифметическую сумму всех выбранных значений данного поля.
AVG производит усреднение всех выбранных значений данного поля.
MAX производит наибольшее из всех выбранных значений данного поля.
MIN производит наименьшее из всех выбранных значений данного поля.
Как использовать агрегатные функции?
Агрегатные функции используются подобно именам полей в предложении SELECT запроса, но с одним исключением, они берут имена поля как аргументы. Только числовые поля могут использоваться с SUM и AVG.
С COUNT, MAX, и MIN, могут использоваться и числовые или символьные поля. Когда они используются с символьными полями, MAX и MIN будут транслировать их в эквивалент ASCII, который должен сообщать, что MIN будет означать первое, а MAX последнее значение в алфавитном порядке (выдача алфавитного упорядочения обсуждается более подробно в Главе 4).
Чтобы найти SUM всех наших покупок в таблицы Заказов, мы можем ввести следующий запрос, с его выводом в Рисунке 6.1:
SELECT SUM (amt)
FROM Orders;
=============== SQL Execution Log ============
| SELECT SUM (amt) |
| FROM Orders; |
| ==============================================|
| |
| ------- |
| 26658.4 |
===============================================
Рисунок 6.1. Выбор суммы.
Это, конечно, отличается от выбора поля, при котором возвращается одиночное значение, независимо от того, сколько строк находится в таблице. Из-за этого, агрегатные функции и поля не могут выбираться одновременно, пока не будет использовано предложение GROUP BY (описанное далее). Нахождение усредненной суммы — это похожая операция (вывод следующего запроса показывается в Рисунке 6.2):
SELECT AVG (amt)
FROM Orders;
=============== SQL Execution Log ============
| SELECT AVG (amt) |
| FROM Orders; |
| ==============================================|
| |
| ------- |
| 2665.84 |
===============================================
Рисунок 6.2. Выбор среднего.
Специальные атрибуты COUNT
Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце, или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT, чтобы производить счет чисел различных значений в данном поле. Мы могли бы использовать ее, например, чтобы сосчитать номера продавцов в настоящее время описанных в таблице Заказов (вывод показывается в Рисунке 6.3):
SELECT COUNT (DISTINCT snum)
FROM Orders;
Использование DISTINCT
Обратите внимание в вышеупомянутом примере, что DISTINCT, сопровождаемый именем поля с которым он применяется, помещен в круглые скобки, но не сразу после SELECT, как раньше. Этого использования DISTINCT с COUNT применяемого к индивидуальным столбцам, требует стандарт ANSI, но большое количество программ не предъявляют к ним такого требования.
=============== SQL Execution Log ============
| SELECT COUNT (DISTINCT snum) |
| FROM Orders; |
| ==============================================|
| |
| ------- |
| 5 |
===============================================
Рисунок 6.3: Подсчет значений поля
Вы можете выбирать многочисленные счета (COUNT) из полей с помощью DISTINCT в одиночном запросе который, как мы видели в Главе 3, не выполнялся когда вы выбирали строки с помощью DISTINCT. DISTINCT может использоваться, таким образом, с любой функцией агрегата, но наиболее часто он используется с COUNT. С MAXиMIN это просто не будет иметь никакого эффекта, а SUMиAVG вы обычно применяете для включения повторяемых значений, так как они законно эффективнее общих и средних значений всех столбцов.