Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

66 Понимание sql

______________________________________________________________________

CH 6

=============== SQL Execution Log ============

| |

| SELECT COUNT (*) |

| FROM Customers; |

| ==============================================|

| |

| ------- |

| 7 |

| |

| |

===============================================

Рисунок 6. 4: Подсчет строк вместо значений

строки, имеющие избыточные или NULL данные в этом поле.

DISTINCT не применим c COUNT (*), потому, что он не имеет никакого

действия в хорошо разработаной и поддерживаемой базе данных.

В такой базе данных, не должно быть ни таких строк, которые бы являлись

полностью пустыми, ни дубликатов ( первые не содержат никаких

данных, а последние полностью избыточны ). Если, с другой стороны,

все таки имеются полностью пустые или избыточные строки, вы

вероятно не захотите чтобы COUNT скрыл от вас эту информацию.

Включение дубликатов в агрегатные функции

Агрегатные функции могут также ( в большинстве реализаций )

использовать аргумент ALL, который помещается перед именем поля,

подобно DISTINCT, но означает противоположное: - включать дубликаты.

ANSI технически не позволяет этого для COUNT, но многие реализации

ослабляют это ограничение.

Различия между ALL и * когда они используются с COUNT -

* ALL использует имя_поля как аргумент.

* ALL не может подсчитать значения NULL.

Пока * является единственым аргументом который включает NULL

значения, и он используется только с COUNT; функции отличные от

COUNT игнорируют значения NULL в любом случае. Следующая

команда подсчитает(COUNT) число не-NULL значений в поле rating

CУММИРОВАНИЕ ДАННЫХ

С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ 67

______________________________________________________________________

в таблице Заказчиков ( включая повторения ):

SELECT COUNT ( ALL rating )

FROM Customers;

АГРЕГАТЫ ПОСТРОЕННЫЕ НА

СКАЛЯРНОМ ВЫРАЖЕНИИ

До этого, вы использовали агрегатные функции с одиночными полями как

аргументами. Вы можете также использовать агрегатные функции с

аргументами которые состоят из скалярных выражений включающих одно

или более полей. ( Если вы это делаете, DISTINCT не разрешается. )

Предположим, что таблица Порядков имеет еще один столбец который

хранит предыдущий неуплаченый баланс (поле blnc) для каждого заказчика.

Вы должны найти этот текущий баланс, добавлением суммы приобретений

к предыдущему балансу.

Вы можете найти наибольший неуплаченый баланс следующим образом:

SELECT MAX ( blnc + (amt) )

FROM Orders;

Для каждой строки таблицы, этот запрос будет складывать blnc и amt

для этого заказчика и выбирать самое большое значение которое он

найдет. Конечно, пока заказчики могут иметь многочисленые порядки,

их неуплаченый баланс оценивается отдельно для каждого порядка.

Возможно, порядок с более поздней датой будет иметь самый большой

неуплаченый баланс. Иначе, старый баланс должен быть выбран как в

запросе выше.

Фактически, имеются большое количество ситуаций в SQL где вы

можете использовать скалярные выражения с полями или вместо полей,

как вы увидете это в Главе 7.

Соседние файлы в папке ПОНИМАНИЕ SQL