Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
work_2.doc
Скачиваний:
9
Добавлен:
09.11.2019
Размер:
291.84 Кб
Скачать
    1. Выборка и агрегирование данных.

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

Пусть необходимо узнать, какие поставщики осуществляли поставки. Для этого можно, очевидно, ввести запрос

SELECT DISTINCT "Код_поставщика"

FROM "Поставки"

То же самое получим с помощью запроса

SELECT "Код_поставщика"

FROM "Поставки"

GROUP BY "Код_поставщика"

Однако, если теперь в список SELECT добавить еще одно поле, например, Код_книги, то получим сообщение об ошибке

ERROR: column "Поставки.Код_книги" must appear in the GROUP BY clause or be used in an aggregate function

т.е. поле Код_книги должно быть указано в строке GROUP BY или использоваться в агрегирующей функции. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для «свободного» столбца должно быть выдано все множество его значений. Поэтому подобный запрос отвергается системой.

Если добавить Код_книги в строку GROUP BY, то в группах с одинаковым значением Код_поставщика данные дополнительно будут сгруппированы по Код_книги.

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

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

SELECT "Код_поставщика"', “Код_книги”, SUM(“Количество”) AS “Количество”

FROM "Поставки"

GROUP BY "Код_поставщика ", “Код_книги”

Если GROUP BY не используется, то при наличии в списке SELECT агрегирующих функций в этот список можно включать лишь SQL-функции или выражения, содержащие такие функции.

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

Предположим, что теперь требуется узнать, сколько книг каждого издательства представлено в базе данных BOOKSHOP. Для этого введем запрос:

SELECT “Издательство”, COUNT(*)

FROM “Книги”

GROUP BY “Издательство”

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

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

Модификатор GROUP BY не предполагает упорядочивание результата. Чтобы упорядочить результаты запроса, в конце инструкции надо добавить модификатор ORDER BY:

SELECT "Код_поставщика"', “Код_книги”, SUM(“Количество”) AS “Количество”

FROM "Поставки"

GROUP BY "Код_поставщика ", “Код_книги”

ORDER BY 1, 3

Строки таблицы можно группировать по любой комбинации ее столбцов. Так, в процессе выполнения запроса:

SELECT “Код_заказчика”, “Оплачен”, COUNT(*) AS “Количество заказов”

FROM “Заказы”

GROUP BY “Код_заказчика”, “Оплачен”

ORDER BY 1

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

Если в запросе используются WHERE и GROUP BY, то строки, не удовлетворяющие условию WHERE, исключаются до выполнения группирования. Например, предыдущий запрос можно модифицировать так, чтобы он выдавал список заказчиков, оплативших заказы, и количество оплаченных ими заказов:

SELECT “Код_заказчика”, “Оплачен”, COUNT(*) “Количество заказов”

FROM “Заказы”

WHERE “Оплачен” = ‘ДА’

GROUP BY “Код_заказчика”, “Оплачен”

ORDER BY 1

Предложение HAVING играет такую же роль для групп, что и WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, а выражение в HAVING должно принимать единственное значение для группы. Например, выдать список поставщиков, поставивших более двух книг:

SELECT “Код_поставщика”, COUNT(*) “Количество поставленных книг”

FROM “Книги”

GROUP BY “Код_поставщика”

HAVING COUNT(*) > 2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]