| Каталог | Индекс раздела |
| Назад | Оглавление | Вперед |
В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так:
Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.
Следует отметить, что здесь столбец - это столбец виртуальной таблицы, в которой могут содержаться данные не только из столбца базовой таблицы, но и данные, полученные путем функционального преобразования и (или) связывания символами арифметических операций значений из одного или нескольких столбцов. При этом выражение, определяющее столбец такой таблицы, может быть сколь угодно сложным, но не должно содержать SQL-функций (вложенность SQL-функций не допускается). Однако из SQL-функций можно составлять любые выражения.
Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).
| Результат: | ||
|---|---|---|
| 'Кол-во лука =' | SUM(К_во) | COUNT(К_во) |
| Кол-во лука = | 220 | 2 |
Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент - пустое множество, функция COUNT принимает значение 0, а остальные - NULL.
Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос
SELECT SUM(Цена),AVG(Цена),COUNT(Цена),
COUNT(DISTINCT Цена),COUNT(*)
FROM Поставки
WHERE ПС = 5;
и получить
| SUM(Цена) | AVG(Цена) | COUNT(Цена) | COUNT(DISTINCT Цена) | COUNT |
|---|---|---|---|---|
| 6.2 | 1.24 | 5 | 4 | 7 |
В другом примере, где надо узнать "Сколько поставлено моркови и сколько поставщиков ее поставляют?":
SELECT SUM(К_во),COUNT(К_во) FROM Поставки WHER ПР = 2;
будет получен ответ:
| SUM(К_во) | COUNT (К_во) |
|---|---|
| -0- | 0 |
Наконец, попробуем получить сумму массы поставленного лука с его средней ценой ("Сапоги с яичницей"):
| Результат: | |
|---|---|
SELECT (SUM(К_во) +AVG(Цена)) FROM Поставки WHERE ПР = 10; |
|
| SUM(К_во)+AVG(Цена) | |
| 220.6 |
| Т | БЛ | COUNT(БЛ) |
|---|---|---|
| 1 | 3 | 18 |
| 1 | 6 | 14 |
| 1 | 19 | 17 |
| 1 | 21 | 15 |
| ... | ||
Если в запросе используются фразы WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования.
Например, выдать для каждого продукта его код и общий объем возможных поставок, учитывая временную недееспособность поставщика с ПС=2:
SELECT ПР, SUM(К_во) FROM Поставки WHERE ПС <> 2 GROUP BY ПР;
Результат, приведенный на рис. 2.3,г, отличается от результата (рис. 2.3,а) аналогичного запроса для всех поставщиков объемом поставок продуктов с кодами 15, 5 и 6.
Фраза HAVING (рис.2.3) играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы. Например, выдать коды продуктов, поставляемых более чем двумя поставщиками: В п.3.6 можно познакомиться с более содержательным примером использования этой фразы.2.5.4. Использование фразы HAVING
SELECT
FROM Поставки
GROUP BY ПС
HAVING COUNT(*) > 2;
Результат:
ПР 9 11 12
| Каталог | Индекс раздела |
| Назад | Оглавление | Вперед |