Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЛЕЩ.docx
Скачиваний:
47
Добавлен:
13.05.2015
Размер:
3.97 Mб
Скачать

1.8.3.5. Стандартные функции

В SQL предусматривается ряд специальных стандартных функций: COUNT (число значений в столбце), SUM (сумма значений по столбцу), AVG (среднее числовое значение в столбце), MAX (самое большое значение в столбце). В общем случае аргументу функции может факультативно предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Для функции COUNT ключевое слово DISTINCT должно быть специфицировано. Специальная функция COUNT (*), для которой использование DISTINCT не допускается, предусмотрена для подсчета всех строк в таблице без исключения каких-либо дубликатов. Если DISTINCT специфицируется, то аргумент должен состоять только из имени столбца. Если DISTINCT не специфицировано, аргумент может представлять собой арифметическое выражение, например ВЕС * 454.

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

Пример.Выдать общее количество поставщиков.

SELECT COUNT (*) FROM SP

Пример. Выдать общее количество поставщиков, поставляющих в настоящее время детали:

SELECT COUNT (DISTINCT НОМЕР_ПОСТАВЩИКА) FROM SP;

Пример. Выдать количество поставок для детали Р2.SELECT COUNT (*) FROM SP WHERE НОМЕР_ДЕТАЛИ = 'Р2';

Пример. Выдать общее количество поставляемых деталей Р2. SELECT SUM (КОЛИЧЕСТВО) FROM SP WHERE НОМЕР_ДЕТАЛИ = 'Р2';

Пример.Выдать номера поставщиков со значением поля СОСТОЯНИЕ меньшим, чем максимальное состояние в таблице S.SELECT НОМЕР_ПОСТАВЩИКА FROM S WHERE СОСТОЯНИЕ < (SELECT MAX (СОСТОЯНИЕ) FROM S);

Пример.Выдать номер поставщика, состояние и город для всех поставщиков, у которых состояние больше или равно среднему для их конкретного города.

SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД FROM S SX WHERE СОСТОЯНИЕ > = (SELECT AVQ (СОСТОЯНИЕ) FROM S SY WHERE SY.ГОРОД = SX.ГОРОД);

1.8.3.6. Запрос с группировкой

Требуется для каждой поставляемой детали выдать номер этой детали и общий объем поставок. Запрос имеет вид:

SELECT НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО) FROM SP GROUP BY НОМЕР_ДЕТАЛИ ORDER BY НОМЕР-ДЕТАЛИ;

Запрос с группировкой реализуется фразой GROUP BY. В рассматриваемом примере строки таблицы SP группируются таким образом, что в одной группе содержатся все строки для детали Р1, в другой–все строки для детали Р2 и т. д. Далее, к каждой группе перекомпонованной таблицы, а не к каждой строке исходной таблицы применяется фраза SELECT. Каждое выражение во фразе SELECT должно принимать единственное значение для группы,т. е. оно может быть либо самим полем, указанным во фразе GROUP BY, либо арифметическим выражением, включающим это поле, либо константой, либо такой функцией, как SUM, которая оперирует всеми значениями данного поля в группе и сводит эти значения к единственному значению.

Фраза GROUP BY не предполагает ORDER BY (упорядочить по). Чтобы гарантировать упорядочение результата этого примера по номерам деталей, следует специфицировать фразу ORDER BY НОМЕР-ДЕТАЛИ. Если поле, по значениям которого осуществляется группирование, содержит какие-либо неопределенные значения, то каждое из них порождает отдельную группу.

Пример.Выдать для каждой поставляемой детали ее номер и общий объем поставок, за исключением поставок поставщика S1.

SELECT НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО) FROM SP WHERE НОМЕР_ПОСТАВЩИКА= 'S1' GROUP BY НОМЕР_ДЕТАЛИ;

Строки, не удовлетворяющие фразе WHERE, исключаются до того, как будет осуществляться какое-либо группирование.

Пример. Выдать номера деталей для всех деталей, поставляемых более чем одним поставщиком (тот же пример, что и в 5.2.5).

SELECT НОМЕР_ДЕТАЛИ FROM SP GROUP BY НОМЕР_ДЕТАЛИ HAVING COUNT (*)>1;

Фраза HAVINGиспользуется для того, чтобы исключать группы и она работает только на одном уровне. Невозможно разбить каждую из этих групп на группы более низкого уровня и т. д., а затем применить некоторую стандартную функцию, например SUM или AVG на каждом уровне группирования.