Для полученной ранее модели данных, состоящей из трех нормализованных отношений ПОСТАВЩИК, ПОСТАВКИ, ДОСТАВКА составим запросы, запишем их в виде формул реляционной алгебры и получим результаты для каждого запроса.
При составлении запросов и вычислении формул следует помнить о том, что результатом выполнения любой операции над отношением является новое отношение, к которому, в свою очередь, можно применить любую операцию реляционной алгебры. Эта важная идея создания новых таблиц на основе старых позволяет составлять запросы любой сложности.
Запрос 1
Сообщить название фирмы-поставщика П1.
Мы получим ответ на этот запрос, если из таблицы ПОСТАВЩИК выделим строку, содержащую сведения о поставщике П1. Это можно сделать, выполнив операцию сцепления отношения ПОСТАВЩИК с известной из запроса константой П1 (т.е. выполнив операцию сцепления отношения с одноэлементным множеством {П1}).
ПОСТАВЩИК * {П1}
В результате выполнения операции получим новое отношение, состоящее из единственного кортежа (т.е. таблицу, состоящую из одной строки).
П1 | Восход | Тула |
Полученная строка содержит лишние сведения. Уточним ответ, применив к вновь полученному отношению операцию проекции на атрибут Имя поставщика. Полученная формула и является формулой запроса.
ПОСТАВЩИК * {П1} [Имя поставщика]
В результате будет выделен один столбец. Это и будет ответом на запрос.
Восход |
Запрос 2
В каком количестве поставляются изделия И2?
Искомые сведения находятся в таблице ПОСТАВКИ. Аналогично Запросу 1 применим к отношению ПОСТАВКИ операцию сцепления с известной константой И2, а затем спроектируем полученное отношение на атрибут Кол.
|
ПОСТАВКИ * {И2} [Кол]
Результаты выполнения операций
П1 П2 | И2 И2 | 200 500 |
200 500 |
Запрос 3
Сколько изделий И2 поставляет фирма Заря?
В этом запросе известными являются значения двух атрибутов: Имя поставщика Заря и номер изделия - И2. Известные и искомые данные находятся в двух таблицах: ПОСТАВЩИК и ПОСТАВКИ, поэтому для ответа на запрос необходимо "привязать" сведения из одной таблицы к сведениям из другой таблицы. Это можно сделать, выполнив операцию сцепления отношений по атрибуту П#.
Для выработки ответа на запрос выполним следующие действия:
узнаем значение атрибута П#, выполнив операцию сцепления отношения ПОСТАВЩИК с одноэлементным множеством Заря;
выполним операцию сцепления полученного результата с отношением ПОСТАВКИ по атрибуту П#;
выполнив операцию сцепление отношения с одноэлементным множеством, выделим кортежи, содержащие сведения об изделии И2;
и, наконец, выполним проекцию на атрибут Кол.
Запишем формулу запроса.
ПОСТАВЩИК * {Заря} * ПОСТАВКИ * {И2} [Кол]
Определим результаты выполнения каждой из операций.
. В результате выполнения операции сцепления отношения ПОСТАВЩИК с одноэлементным множеством {Заря} получим новое отношение, содержащее единственный кортеж (т.е. новую таблицу, состоящую из одной строки).
П2 | Заря | Самара |
. Вторая операция выполняет сцепление полученного отношения, имеющего арность 3, с отношением ПОСТАВКИ, имеющим также арность 3, по одинаковому значению атрибута П#. В результате получим новое отношение арностью 5. В него войдут все кортежи сцепляемых отношений, у которых значение атрибута П# = П2.
|
П2 | Заря | Самара | И1 | |
П2 | Заря | Самара | И2 |
. В результате выполнения третьей операции из полученного отношения выберутся строки, в которых значение атрибута И# равно И2.
. С помощью операции проекции уточним ответ, выделив столбец Кол.
П2 | Заря | Самара | И2 |
Запрос 4
Какие поставщики и по какому тарифу поставляют изделие И2?
Известное данное (номер изделия П2) находится в таблице ПОСТАВКИ, а искомые данные (имя поставщика и тариф) - в таблицах ПОСТАВЩИК и ДОСТАВКА. Поэтому для выработки ответа на запрос необходимо связать данные из трех таблиц.
Из отношения ПОСТАВКИ с помощью операции сцепления отношения с одноэлементным множеством {И2} выделим кортежи, содержащие номера поставщиков, поставляющих изделие И2. Затем выполним сцепление полученного отношения с отношением ПОСТАВЩИК по атрибуту П#. Получим отношение, содержащее атрибут с названиями городов, из которых доставляются изделия И2. Операция сцепления полученного отношения с отношением ДОСТАВКА по атрибуту Город сформирует отношение, содержащее атрибуты с искомыми данными. Наконец, выполнив проекцию этого отношения на атрибуты Имя поставщика и Тариф, выделим искомые данные.
Запишем формулу запроса.
ПОСТАВКИ * {И2} * ПОСТАВЩИК * ДОСТАВКА [Имя поставщика, Тариф]
Определим результаты выполнения каждой операции (все операции в формуле и получаемые результаты пронумерованы).
П1 | И2 | П1 | И2 | Восход | Тула | |||||||
П2 | И2 | П2 | И2 | Заря | Самара | |||||||
П1 | И2 | Восход | Тула | Восход | ||||||||
П2 | И2 | Заря | Самара | Заря | ||||||||
|
Можно заметить, что в результате последовательного выполнения нескольких операций сцепления арность отношений растет, т.е. в таблицах увеличивается количество столбцов. Рост объемов промежуточных результатов при выполнении такого запроса на ЭВМ может привести к увеличению времени выполнения каждой следующей операции, и общее время выполнения запроса может оказаться недопустимо большим.
Рассмотрим другой вариант формулы запроса. Для уменьшения объемов промежуточных таблиц используем дополнительные операции проекции. Это позволит на каждом этапе отсекать ненужные столбцы и оставлять лишь те столбцы, которые необходимы для выполнения последующей операции сцепления или для вывода искомых данных.
Результаты выполнения операций:
П1 | И2 | П1 | П1 | Восход | Тула | Восход | Тула | ||||
П2 | И2 | П2 | П2 | Заря | Самара | Заря | Самара |
Восход | Тула | Восход | |||
Заря | Самара | Заря |
Использовав булевы операторы, можно строить формулы для более сложных запросов. С помощью теоретико-множественных операций объединения и вычитания множеств, можно записывать формулы для запросов на добавление и удаление кортежей отношений.
Заключение
Язык для взаимодействия с БД SQL появился в середине 70-х и был разработан в рамках проекта экспериментальной реляционной СУБД System R. Исходное название языка SEQUEL (Structered English Query Language) только частично отражает суть этого языка. Конечно, язык был ориентирован главным образом на удобную и понятную пользователям формулировку запросов к реляционной БД, но на самом деле уже являлся полным языком БД, содержащим помимо операторов формулирования запросов и манипулирования БД средства определения и манипулирования схемой БД; определения ограничений целостности и триггеров; представлений БД; возможности определения структур физического уровня, поддерживающих эффективное выполнение запросов; авторизации доступа к отношениям и их полям; точек сохранения транзакции и откатов. В языке отсутствовали средства синхронизации доступа к объектам БД со стороны параллельно выполняемых транзакций: с самого начала предполагалось, что необходимую синхронизацию неявно выполняет СУБД.
Список литературы
1. "SQL Полное руководство" Киев, 1998
. "Программирование в среде СУБД FoxPro 2.0" Москва, 1993
. "Эффективная работа с Microsoft Access 7.0" Питер, Санкт-Петербург, 1997