Программирование >>  Руководство по sql 

1 ... 34 35 36 [ 37 ] 38 39 40 ... 105


Обратите внимание на различие в результатах выполнения следующих запросов: первый находит для каждой строки таблицы titles соответствующее значение годового объема продаж, второй вычисляет общую сумму, полученную за год от продажи всех книг (одно значение для набора, состоящего из всех строк таблицы).

SQL:

select ytd sales from titles

Результат: ytd sales

4095

3336

4072

3876

2032

4095

15096

8780

NULL

18722

2045

22246

4095

NULL

SQL:

select sum(ytd sales) from titles

Результат:

97446

В первом случае результат возвращается для каждой отдельной строки таблицы, во втором получается одно значение для всех строк. Получаемые таким образом столбцы результата выводятся без заголовков. В ряде случаев заголовок может генерироваться самой системой (как это, например, делается в SQL Anywere). Чтобы сделать результат более понятным, можно использовать следующий запрос:

SQL:

select sum{ytd sales) as Total from titles

Результат: Total

97446



в большинстве диалектов SQL (включая SQL Anywhere) запрешается смешивать в одном предложении обычные значения и значения афегируюших функций. Таким образом, список выбора может быть либо пустым, либо состоять из имен столбцов и выражений (обрабатывающих значения строк), либо включать только афегирующие функции (применяющиеся к наборам значений). Единственным исключением является предложение GROUP BY, которое рассмафивается в главе6.

Ниже приведен пример обычно недопустимого запроса:

SQL (вариант):

select price, sum(price) from titles

В этом случае проблема заключается в том, что price возвращает значение для каждой сфоки, тогда как sum(price) возвращает значение для целого набора строк (в данном случае для всех Сфок таблицы). Если в системе не предусмофена обработка подобной ситуации, вы получите сообщение о синтаксической ошибке.

Если же подобный запрос будет обработан, то, скорее всего, вы получите следующий результат (как, например, в Sybase SQL Server):

Результат: price

19.99 236.26

11.95 236.26

2.99 236.26

19.99 236.26

19.99 236.26

2.99 236.26

NULL 236.26

22.95 236.26

20.00 236.26

NULL 236.26

21.59 236.26

10.95 236.26

7.00 236.26

19.99 236.26

7.99 236.26

20.95 236.26

11.95 236.26

14.99 236.26

В столбце без названия содержится значение общей стоимости всех книг, тогда как в левом столбце представлена цена каждой книги. Обратите внимание, что все значения в правом столбце одинаковы, так как в каждой сфоке вычислялась одна и та же сумма.

Синтаксис агрегирующих функций

Афегирующие функции всегда имеют аргументы (argument). Аргументы являются выражениями и заключаются в скобки. Общая форма афегирующей функции имеет следующий вид:

aggregate function ([DISTINCT] выражение)

Список афегирующих функций приведен на рис. 5.L

Со всеми афегирующими функциями, кроме COUNT(*), можно использовать ключевое слово DISTINCT. Тем не менее не имеет никакого смысла использо-



вать его с функциями MIN и МАХ, так как получаемые значения в обоих случаях будут одинаковы.

В качестве аргументов афегирующих функций обычно используются названия столбцов, но также допускаются константы, функции и любые их комбинации с арифметическими операторами.

Агрегирующая функция

Результат

SUM([DIST1NCT] выражение)

Сумма (различных) значений

AVG([DISTINCT] выражение)

Средняя величина (различных) значений

COUNT([DISTINCT] выражение)

Количество (различных) ненулевых значений

COUNT(*)

Количество выбранных сфок

МАХ(выражение)

Максимальное значение

МШ(выражение)

Минимальное значение

Рис. 5.1. Агрегирующие функции

Например, с помощью следующего оператора можно найти среднюю стоимость всех книг в случае удвоения их цены:

SQL:

select avg(price * 2) from titles

Результат:

29.5325

Функции COUNT и COUNT(*). Несмофя на внещнюю схожесть, функции COUNT и COUNT(*) используются для разных целей. COUNT в качестве аргумента использует столбец или выражение и подсчитывает общее количество его ненулевых значений, тогда как COUNT(*) находит общее количество сфок, независимо от наличия в них нулевых значений. Сравните эти функции на следующем примере:

SQL:

select count(price), count(*) from titles

Результат:

Получаемые с помощью этих функций результаты отличаются, так как две строки в таблице titles содержат нулевые значения в столбце price. При использовании столбца без нулевых значений результаты работы функций COUNT и COUNT(*) будут одинаковы.

SQL:

select count(title id), count(*) from titles

Результат:



1 ... 34 35 36 [ 37 ] 38 39 40 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика