Скачиваний:
102
Добавлен:
02.05.2014
Размер:
2.3 Mб
Скачать

7.7.6. Определить общее количество поставщиков

SELECT COUNT(*) AS N FROM S ;

Результатом будет таблица с одним столбцом, которому присвоено имя N, и одной строкой, содержащей значение 5. Язык SQL поддерживает типичный набор обобщаю­щих функций: COUNT, SUM, AVG, МАХ и MIN. Однако имеется несколько специфических для языка SQL особенностей, которые пользователю необходимо знать.

  • В общем случае аргументу обобщающей функции может предшествовать необяза­тельное ключевое слово DISTINCT (например, SUM(DISTINCT QTY)), указывающее, что перед применением этой функции дублирующиеся строки должны быть уда­лены. Для функций МАХ и MIN ключевое слово DISTINCT является излишним и не вызывает никакого действия.

  • Специальная обобщающая функция C0UNT(*) не допускает использования ключе­вого слова DISTINCT и предназначена для подсчета всех строк в таблице без пред­варительного удаления дублирующихся строк.

  • Любые NULL-значения в столбце-аргументе (глава 18) удаляются перед примене­нием обобщающей функции в зависимости от того, указано ли ключевое слово DISTINCT, кроме случая использования обобщающей функции C0UNT(*), когда NULL-значения обрабатываются так же, как обычные значения.

  • Если аргумент представляет собой пустое множество, обобщающая функция COUNT возвращает значение нуль, а все другие операторы возвращают NULL-значение (неопределенное значение). (В [3.3] показано, что подобное пове­дение операторов некорректно, однако язык SQL определяет их именно та­ким образом.)

7.7.7. Определить в поставках максимальное

и минимальное количество деталей с номером 'Р2'

SELECT МАХ ( SP.QTY ) AS MAXQ, MIN ( SP.QTY ) AS MINQ FROM SP

WHERE SP.Pl = 'P2' ;

6 Ортогональность здесь означает независимость. Язык является ортогональным, если неза­висимые понятия сохраняют в нем свою независимость и не смешиваются между собой непо­нятным образом. Ортогональность весьма желательна, поскольку чем менее ортогонален язык, тем он более сложен и, как это ни парадоксально, менее мощен.

Здесь оба предложения, FROM и WHERE, фактически предоставляют часть аргументов для двух обобщающих функций. Следовательно, по логике вещей они должны были бы записываться в скобках, заключающих аргументы. Тем не менее данный запрос действительно должен записываться именно так, как показано выше. Этот неортодок­сальный подход к синтаксису оказывает существенное отрицательное влияние на структуру, удобство использования и ортогональность6 языка SQL. Например, одно из следствий состоит в том, что обобщающие функции не могут быть вложенными, в ре­

зультате чего такой запрос, как "Получить среднее итоговое количество деталей", нельзя сформулировать без громоздких выражений. Если быть точным, то следующий запрос ***НЕКОРРЕКТЕН***.

SELECT AVG (SUM (SP.QTY) ) ~ Внимание! Это ошибка! FROM SP;

Вместо этого данный запрос следовало бы сформулировать, например, так. SELECT AVG ( X )

FROM ( SELECT SUM ( SP.QTY ) AS X FROM SP

GROUP BY SP.St ) AS POINTLESS ;

Назначение предложения GROUP BY разъясняется в следующем примере, а использо­вание вложенных подзапросов — несколько ниже. Стоит отметить, что возможность вложения подзапросов в предложение WHERE, как было сделано в этом примере, появи­лась только в стандарте SQL/92 и еще не используется достаточно широко.

Замечание. Спецификация AS POINTLESS бессмысленна, однако ее наличия требуют синтаксические правила языка SQL (приложение А).

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]