|
Программирование >> Руководство по sql
Обратите внимание на различие в результатах выполнения следующих запросов: первый находит для каждой строки таблицы 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 и МАХ, так как получаемые значения в обоих случаях будут одинаковы. В качестве аргументов афегирующих функций обычно используются названия столбцов, но также допускаются константы, функции и любые их комбинации с арифметическими операторами.
Рис. 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 Результат:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |