Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-42_44-48.docx
Скачиваний:
653
Добавлен:
24.03.2016
Размер:
2.41 Mб
Скачать

40. Запросы с группировкой. Предложение group by.

Иногда требуется получить агрегированные значения не по всему результирующему набор данных, а по каждой из входящих в него групп записей, характеризующихся одинаковыми значениями какого-либо столбца. Для применения агрегатных функций предполагается предварительная операция группировки. Суть операции группировка: при группировке всё множество кортежей отношения разбивается на имеющие одинаковые значения атрибутов, которые заданы в списке группировки. Эту возможность предоставляет предложение GROUP BY инструкции SELECT.

Назначение предложения GROUP BY на примере: Какова средняя стоимость заказа для каждого сотрудника компании?

SELECT ID_SLZH, AVG(PRICE)

FROM ZAKAZY

GROUP BY ID_SLZH

На логическом уровне запрос выполняется следующим образом:

1. Заказы делятся на группы, по одной для каждого служащего. В каждой

группе все заказы имеют одно и то же значение в столбце ID_SLZH.

2. Для каждой группы вычисляется среднее значение столбца PRICE по всем

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

Эта строка содержит значение столбца ID_SLZH для группы и среднюю стоимость заказа для данной группы.

41. Правила выполнения запросов с группировкой.

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

столбец (столбцы) группировки и одна или несколько агрегатных функций. Таким образом, возвращаемым столбцом может быть:

– константа;

– агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

– столбец группировки, который по определению имеет одно и то же значение во всех строках группы;

– выражение, включающее в себя перечисленные выше элементы.

Запросы с группировкой и с условиями отбора групп выполняются следующим образом.

1. Взять таблицу, указанную в предложении FROM.

2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке таблицы. Если при этом получается значение TRUE, то текущая строка добавляется в результирующую таблицу, если получается значение FALSE, то строка отбрасывается.

3. Если имеется предложение GROUP BY, разделить строки таблицы таким

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

группировки (т. е. в столбцах, указанных за ключевым словом GROUP BY).

4. Если имеется предложение HAVING, применить заданное в нём условие к каждой группе и оставить в результирующей таблице те группы, для которых

это условие выполняется.

5. Для каждой из оставшихся групп строк вычисляются значения агрегатных функций, указанных в предложении SELECT. При этом для каждой группы

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

42. Вложенные запросы.

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

– вложенные запросы соответствуют словесному описанию запроса и поэтому являются самым естественным способом выражения запроса;

– вложенные запросы позволяют структурировать запрос путем разбиения на части (на главный запрос и вложенные запросы);

– существуют ситуации, когда невозможно обойтись без вложенных запросов.

Вложенным называется запрос, содержащийся в предложении WHERE или

HAVING другого запроса.

Рассмотрим следующую ситуацию. Требуется вывести список офисов, для которых плановый объем продаж (поле TARGET) превышает сумму плановых

объемов продаж всех служащих (поле QUOTA).

Первая часть этого запроса должна выглядеть как

SELECT CITY

FROM OFFISY

WHERE TARGET > ???

Во второй части заказа нужно ответить на вопрос: как определить сумму плановых объемов продаж служащих для отдельного офиса (скажем офиса с

идентификатором 22). Это можно сделать с помощью запроса, использующего агрегатную функцию SUM:

SELECT SUM(QUOTA)

FROM SLUZHASCHIE

WHERE ID_OFC = 22

А теперь объединим эти запросы путем замены знаков ??? на второй запрос

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

SELECT CITY

FROM OFFISY

WHERE TARGET > (SELECT SUM(QUOTA)

FROM SLUZHASCHIE

WHERE SLUZHASCHIE.ID_OFC = OFFISY.ID_OFC)

В приведенном запросе вложенный (внутренний) запрос выполняет для каждого офиса вычисление суммы плановых продаж всех служащих, работающих в данном офисе. Главный (внешний) запрос сравнивает плановый объем продаж

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

44. Правила выполнения многотабличных запросов на выборку.

Объединение – это подмножество декартова произведения двух таблиц. Произведение двух таблиц представляет собой таблицу, состоящую из всех возможных пар строк обеих таблиц, составленной из всех столбцов первой таблицы, за которыми следуют все столбцы второй таблицы. На основе понятия декартова произведения, определим формальное определение правил выполнения многотабличных запросов на выборку.

А теперь приведем правила, раскрывающие смысл любого многотабличного запроса на выборку и позволяющие определять процедуру.

1. Сформировать произведение таблиц, перечисленных в предложении FROM.

2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке таблицы произведения и оставить в ней те строки, для которых это условие выполняется.

3. Для каждой из оставшихся строк сформировать строку результирующей таблицы, включающей столбцы, указанные в предложении SELECT.

4. Если в предложении SELECT указано ключевое слово DISTINCT, то повторяющиеся строки из результирующей таблицы удаляются.

5. Если в запросе имеется предложение ORDER BY, результирующая таблица сортируется.

45. Операторы обновления данных. Операторы INSERT, UPDATE, DELETE.

insert - вставить запись: добавляет новую запись в таблицу. Если после insert стоит current, то добавляется запись из буфера, иначе добавляется запись со значениями полей, указанными в операторах присваивания. Остальные поля получают значения по умолчанию.

update - изменить запись. Изменяет существующую запись или множество записей, удовлетворяющих условию where. Изменяемые поля указываются в операторах присваивания. Все остальные поля остаются без изменений.

delete - удалить запись. Удаляет текущую запись или множество записей, удовлетворяющих условию where.

Оператор Insert предназначен для добавления новых данных в таблицу. Он имеет следующий формат:

INSERT INTO TableName [(columnList)] VALUES (dataValueList);

Здесь параметр TableName (Имя таблицы) может представлять имя таблицы базы данных. Параметр columnList (Список столбцов) представляет собой список, состоящий из имен одного или более столбцов, разделенных запятыми. Параметр columnList является необязательным. Если он опущен, то предполагается использование списка из имен всех столбцов таблицы, указанных в том порядке, в котором они были описаны в операторе CREATE TABLE. Параметр dataValueList (Список значений данных) должен следующим образом соответствовать параметру columnList:

количество элементов в обоих списках должно быть одинаковым;

должно существовать прямое соответствие между позицией одного и того же элемента в обоих списках

типы данных элементов списка dataValueList должны быть совместимы с типом данных соответствующих столбцов таблицы.

Пример использования оператора Insert.

Задание: Поместите в таблицу staff новую запись, содержащую данные во всех столбцах.

INSERT INTO Staff VALUES('SG16', 'Alan', 'Brown', 'Assistant’, 'M’, DATE '1957-05-25',8300, 'B003');

Оператор Update позволяет изменять содержимое уже существующих строк указанной таблицы. Этот оператор имеет следующий формат:

UPDATE tableName

SET columnNamel = dataValuel [, columnName2 = dataValue2 … ]

[WHERE searchCondition];

Здесь параметр tableName представляет имя таблицы базы данных. В конструкции SET указываются имена одного или более столбцов, данные в которых необходимо изменить. Конструкция WHERE является необязательной. Если она опущена, значения указанных столбцов будут изменены во всех строках таблицы. Если конструкция WHERE присутствует, то обновлены будут только те строки, которые удовлетворяют условию поиска, заданному в параметре searchCondition. Параметры dataValue1, dataValue2... представляют новые значения соответствующих столбцов и должны быть совместимы с ними по типу данных.

Пример использования оператора Update.

Задание: Всем менеджерам компании повысить заработную плату на 5%.

UPDATE Staff

SET salary = salary*1.05

WHERE position = 'Manager’;

Оператор Delete позволяет удалять строки данных из указанной таблицы. Этот оператор имеет следующий формат:

DELETE FROM tableName

[WHERE searchCondition];

Как и в случае операторов INSERT и UPDATE, параметр TableName представляет собой таблицы базы данных. Параметр searchCondition является необязательным — если он опущен, из таблицы будут удалены все существующие в ней строки. Однако сама по себе таблица удалена не будет. Если необходимо удалить не только содержимое таблицы, но и ее определение, следует использовать оператор DROP TABLE. Если конструкция WHERE присутствует, из таблицы будут удалены только те строки, которые удовлетворяют условию отбора, заданному параметром searchCondition

Пример использования оператора Delete.

Задание: Удалить все записи об осмотрах сдаваемого в аренду объекта с учетным номером PG4.

DELETE FROM Viewing

WHERE propertyNo = 'PG4';

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