Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009
.pdf3. Реляционная модель данных |
83 |
Пример 3. Запись выражения.
Приведем запись выражения, соответствующее запросу: «Получить имена поставщиков, которые поставляют все детали».
5Х.Город_П WHERE FORALL РХ (EXISTS SPX
(SPX.n# = SX.n# AND SPХ.Д# = 5Х.Д# ))
Равносильное этому выражение выглядит так:
5Х.Город_П WHERE NOT EXISTS РХ (NOT EXISTS SPX
(SPX.n# = SX.n# AND 5РХ.Д# = 5Х.Д#))
Описанное исчисление не обладает вычислительной полнотой, так как не позволяет выполнять вычисления, связанные с обработкой данных в базах. Добавление вычислительных функций в это исчисление можно реализовать путем расширения определения операндов сравнения и элементов целевого списка таким образом, чтобы они допускали использование скалярных выражений с литералами, ссылками на атрибуты и итоговыми функциями. В качестве итоговых могут выступать следующие функции: COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное). Для целевых элементов целесообразно использовать спецификацию вида «AS <имя атрибута>», позволяющую явно задать имя результирующему атрибуту, если нет очевидного наследуемого имени.
Пример 4. Запись запроса.
Пусть требуется получить информацию о каждой поставке с полными данными о деталях и общем весе поставки. Запрос на дополненном функциями языке реляционного исчисления кортежей может выглядеть следующим образом:
(SPX.n#, SPX.Количество, РХ, РХ.Вес * 5РХ.Количество AS Общий_Вес) WHERE РХ.Д# = SPX.JX#
Вариант реляционного исчисления, основанного на доменах {исчисление доменов), предложен Лакроиксом и Пиротте (Lacroix and Pirotte), которые также разработали на его основе соответствующий язык ILL. Другими языками, основанными на исчислении доменов, являются: FQL, DEDUCE, а также QBE с некоторыми оговорками.
По утверждению Дейта, язык QBE включает элементы исчисления кортежей и исчисления доменов, но более близок ко второму. Он не является реляционно полным, так как не поддерживает операцию отрицания квантора существования (NOT EXISTS). Несмотря на этот недостаток, язык QBE получил широкое распространение в современных СУБД. Тем более, что реализации этого языка, как правило, шире исходного языка.
84 |
Часть 1. Основы построения баз данных |
Исчисление доменов имеет много сходства с исчислением кортежей. В отличие от исчисления кортежей, в исчислении доменов основой любого выражения запроса выступают переменные доменов. Переменная домена — это скалярная переменная, значения которой охватывают элементы некоторого домена.
Большая часть различий рассматриваемых исчислений заключается в том, что исчисление доменов поддерживает дополнительную форму условия, называемую условием принадлежности. В общем виде условие принадлежности записывается в виде:
R ( A , : ^ , A 2 : ^ , . . . ),
где А. — атрибут отношения R, а й — переменная домена или литерал. Проверяемое условие истинно, если и только если существует кортеж в отношении R, имеющий атрибуты А, равные заданным в выражении соответствующим значениям
Например, выражение SP (П# : 'S1', Д# : 'Р1') истинно, если в отношении SP существует хотя бы один кортеж со значением *S 1' атрибута П# и значением Ф Г атрибута Д#. Аналогично, выражение SP (П# : SX, Д# : РХ) истинно, если в отношении SP существует кортеж, в котором значение атрибута П# эквивалентно текущему значению переменной домена SX, а значение атрибута Д# эквивалентно текущему значению переменной домена РХ.
В следующих примерах будем подразумевать существование (объявленное каким-либо образом, подобно оператору RANGE исчисления кортежей) следующих переменных доменов: SX (домен П#), РХ (домен Д#), NAMEX (домен Имя).
Пример 5. Выражения исчисления доменов.
(SX) WHERE S ( n # :SX)
(SX) WHERE S (П# : SX, Город_П : 'Москва')
NAMEX WHERE EXISTS SX ( S (П# : SX, Имя : NAMEX) AND FORALL PX ( IF P (Д# : РХ )
THEN SP (П# : SX, Д# : PX ) ) )
Первое выражение означает множество всех номеров поставщиков отношения S, второе — множество номеров поставщиков из Лондона. Третье выражение соответствует запросу на получение имен поставщиков, производящих все детали.
3.8. Язык запросов по образцу QBE
Хранимые в базе данные можно обрабатывать вручную, последовательно просматривая и редактируя данные в таблицах с помощью имеющихся в СУБД соответствующих средств. Для повышения эффективности применя-
3. Реляционная модель данных |
85 |
ют запросы, позволяющие производить множественную |
обработку данных, |
то есть одновременно вводить, редактировать и удалять множество записей, а также выбирать данные из таблиц.
Запрос представляет собой специальным образом описанное требование, определяющее состав производимых над БД операций по выборке, удалению или модификации хранимых данных.
Для подготовки запросов с помощью различных СУБД чаще всего используются два основных языка описания запросов:
•язык QBE (Query By Example) — язык запросов по образцу;
•SQL (Structured Query Language) — структурированный язык запросов. По возможностям манипулирования данными при описании запросов ука-
занные языки практически эквивалентны. Главное отличие между ними, повидимому, заключается в способе формирования запросов: язык QBE предполагает ручное или визуальное формирование запроса, в то время как использование SQL означает программирование запроса.
Характеристика языка QBE
Теоретической основой языка QBE является реляционное исчисление с переменными-доменами. Язык QBE позволяет задавать сложные запросы к БД путем заполнения предлагаемой СУБД запросной формы. Такой способ задания запросов обеспечивает высокую наглядность и не требует указания алгоритма выполнения операции — достаточно описать образец ожидаемого результата. В каждой из современных реляционных СУБД имеется свой вариант языка QBE.
На языке QBE можно задавать запросы однотабличные и многотабличные (выбирающие или обрабатывающие данные из нескольких связанных таблиц).
С помощью запросов на языке QBE можно выполнять следующие основные операции:
•выборку данных;
•вычисление над данными;
•вставку новых записей;
•удаление записей;
•модификацию (изменение) данных.
Результатом выполнения запроса является новая таблица, называемая ответной (первые две операции), или обновленная исходная таблица (остальные операции).
Выборка, вставка, удаление и модификация могут производиться безусловно или в соответствии с условиями, задаваемыми с помощью логических выражений. Вычисления надданными задаются с помощью арифметических выражений и порождают в ответных таблицах новые поля, называемые
вычисляемыми.
86 |
Часть 1. Основы построения баз данных |
Запросная форма имеет вид таблицы, имя и названия полей которой совпадают с именем и названиями полей соответствующей исходной таблицы. Чтобы узнать имена доступных таблиц БД, в языке QBE предусмотрен запрос на выборку имен таблиц. Названия полей исходной таблицы могут вводиться в шаблон вручную или автоматически. Во втором случае используется запрос на выборку заголовков столбцов.
В современных СУБД, например в Access и Visual FoxPro, многие действия по подготовке запросов с помощью языка QBE выполняются визуально с помощью мыши. В частности, визуальное связывание таблиц при подготовке запроса выполняется не элементами примеров, а просто «протаскиванием» мышыо поля одной таблицы к полю другой.
Первоначальный вариант QBE
В большинстве современных СУБД имеется свой вариант QBE, незначительно отличающийся от первого описания QBE, предложенного Злуффом М.М. в 1975-1977 гг. Рассмотрим основные возможности QBE, опираясь на первоначальный его вариант.
Для иллюстрации средств и возможностей языка QBE используем таблицы БД, которая относится к торговой сфере и используется в фирме, продающей товары нескольких видов. База данных включает четыре следующие таблицы с полями:
•ЕМР (служащие): Ф И О — фамилия и инициалы служащего, ЗАРПЛАТА — размер должностного оклада, Р У К О В О Д И Т Е Л Ь — фамилия и инициалы руководителя, ОТДЕЛ — название отдела, в котором работает служащий;
•SALES (продажи): ОТДЕЛ — название отдела, ТОВАР — название товара;
•SUPPLY (поставщики): ТОВАР — название поставляемого товара, ПОСТАВЩИК — название организации, поставляющей товар;
• TYPE (типы товаров): ТОВАР — название товара, ЦВЕТ — его цвет,
СТ О И М О С Т Ь — стоимость товара.
Втаблицах приведены неполные и упрощенные сведения. Так, в таблице TYPE указаны не все виды товаров, приведенные в таблице SALES.
Для описания переменных в условиях отбора записей, а также для связывания шаблонов в запросах используются элементы примера.
Элемент примера играет роль идентификатора переменной (как в языке программирования) и задается с помощью символьно-цифровой последовательности. Элементы примера в шаблонах выделим подчеркиванием. Вид (длина и состав) элемента примера роли не играют: главное чтобы при использовании в нескольких местах шаблона он был одинаков. Таким образом, как элементы примера, в частности, можно использовать идентификаторы example, х или у.
Для указания системе необходимости включения в ответную таблицу того или иного поля используется «Р.», что означает «напечатать».
3. Реляционная модель данных |
87 |
ЕМР |
ФИО |
ЗАРПЛАТА |
РУКОВОДИТЕЛЬ |
|
ОТДЕЛ |
|
|
Киселев В.М. |
1800 |
Белкин Б.Н. |
|
хозтовары |
|
|
Гурский С.И. |
1600 |
Томилов А.Н. |
|
игрушки |
|
|
Андреева Е.А. |
2000 |
Петров А.С. |
|
косметика |
|
|
Левин П.Г. |
2200 |
Петров А.С. |
канцтовары |
||
|
Носов А.П. |
1600 |
Томилов А.Н. |
|
игрушки |
|
|
Гофман В.Э. |
2600 |
Андреева Е.А. |
|
косметика |
|
|
Сорокина Т.В. |
1700 |
Андреева Е.А. |
|
косметика |
|
|
Белкин Б.Н. |
1800 |
Петров А.С. |
|
хозтовары |
|
|
Семин С.В. |
2200 |
Левин П.Г. |
канцтовары |
||
|
Григорьев А.Н. |
1900 |
Томилов А.Н. |
|
игрушки |
|
|
Томилов А.Н. |
2000 |
Петров А.С. |
|
игрушки |
|
SALES |
ОТДЕЛ |
ТОВАР |
SUPPLY |
ТОВАР |
|
ПОСТАВЩИК |
|
канцтовары |
бумага |
|
ручка |
|
Pencraft |
|
хозтовары |
мыло |
|
бумага |
|
Pencraft |
|
канцтовары |
карандаш |
|
мыло |
|
Procter & Gamble |
|
косметика |
помада |
|
карандаш |
Flic |
|
|
игрушки |
самолет |
|
чернила |
|
Pencraft |
|
игрушки |
машина |
|
духи |
|
Beautex |
|
игрушки |
кукла |
|
чернила |
|
Flic |
|
косметика |
духи |
|
посуда |
|
Cremco |
|
канцтовары |
чернила |
|
помада |
|
Beautex |
|
хозтовары |
посуда |
|
самолет |
|
Signal |
|
канцтовары |
ручка |
|
машина |
|
Signal |
|
|
|
|
кукла |
|
Signal |
|
|
|
|
посуда |
|
Flic |
|
|
|
|
ручка |
|
Beautex |
|
|
|
|
карандаш |
Pencraft |
88 |
|
|
Часть 1. Основы построения баз данных |
TYPE |
ТОВАР |
ЦВЕТ |
СТОИМОСТЬ |
|
посуда |
белый |
30 |
|
помада |
красный |
17 |
|
духи |
|
42 |
|
ручка |
зеленый |
6 |
|
карандаш |
синий |
2 |
|
чернила |
зеленый |
4 |
|
чернила |
синий |
3 |
|
карандаш |
красный |
2 |
|
карандаш |
синий |
2 |
Пример 1. Запрос на выборку.
С учетом изложенного запрос на выборку всех зеленых товаров можно записать в следующем виде:
TYPE |
ТОВАР |
ЦВЕТ |
СТОИМОСТЬ |
|
Р. XX |
зеленый |
|
Словесно запрос можно сформулировать следующим образом: «Вывести все товары XX, цвет которых зеленый». В приведенном шаблоне элемент примера XX не обязателен и его можно опустить. Элементы примера указываются обязательно при записи логических условий, а также при связывании таблиц в запросах.
Пустые колонки из шаблона можно удалять. Пример 2. Удаление колонок.
У нас неиспользуемым столбцом является СТОИМОСТЬ. Исходя их этого, для приведенного шаблона можно записать следующий эквивалентный шаблон:
TYPE ТОВАР ЦВЕТ
Р.зеленый
После заполнения шаблона для получения результата нажимается соответствующая клавиша, например <Enter>, и начинается выполнение запроса. Результатом выполнения приведенного запроса является следующая таблица:
TYPE ТОВАР
ручка
чернила
3. Реляционная модель данных |
89 |
Рассмотрим основные возможности перечисленных выше типов операций,
используемых в запросах. |
|
||
|
|
Выборка |
данных |
Простая |
выборка. |
Примером простой выборки является запрос: «Вывес- |
|
ти все возможные цвета товаров из таблицы TYPE». |
|||
Пример 3. Простая |
выборка. |
|
|
Заполненный шаблон в этом случае будет выглядеть так: |
|||
TYPE |
ТОВАР |
ЦВЕТ |
СТОИМОСТЬ |
|
|
Р. |
|
Ответная таблица имеет единственный столбец ЦВЕТ, содержащий значения: белый, красный, пусто (значение не задано), зеленый и синий. Дублируемые значения при этом пропадают.
Если требуется вывести данные из нескольких полей исходной таблицы, в каждом из соответствующих столбцов шаблона записывается «Р.». Занесение «Р.» во все столбцы шаблона можно заменить записью «Р.» в первом столбце шаблона под именем таблицы.
Простая выборка с упорядочиванием. Для упорядочения выводимых значений по возрастанию и по убыванию используются конструкции «АО.» и «DO.» соответственно. Если требуется выполнить упорядочивание по нескольким столбцам, применяют конструкции вида: «АО(1).», «АО(2).».
Выборка с квалификаторами (условиями). Выбор записей из исходной таблицы в общем случае может быть основан на: точном совпадении, частичном совпадении, сравнении.
1. Точное совпадение задается вводом констант в соответствующих полях шаблона, как в случае запроса по товарам зеленого цвета.
2. Частичное совпадение задается с помощью элементов примера. В частности, для формулировки запроса о выводе всех видов товаров, названия которых начинаются с буквы «и», можно воспользоваться конструкцией «Р.ике», записанной в поле Т О В А Р таблицы TYPE. Здесь: «Р.» задает вывод, «и» — константа, а «ке» — элемент примера, играющий роль переменной.
Используя элементы примера, можно задавать различные варианты частичного совпадения со значениями данных из таблиц: в начале «ике», в конце «ха», в середине «х!ох2» и в произвольном месте.
Поскольку элементу примера сопоставим любой символ, в том числе и пустой (отсутствие символа), то условию частичного совпадения «х!ох2» удовлетворяют слова, не только имеющие символ «о» в середине, но начинающиеся и заканчивающиеся на «о».
90 Часть 1. Основы построения баз данных
Пример 4. Частичное совпадение.
Шаблон запроса с выбором товаров синего цвета, в середине названий которых имеется буква «р», выглядит так:
TYPE |
ТОВАР |
ЦВЕТ |
СТОИМОСТЬ |
|
Р.хру |
синий |
|
Результат в этом случае будет следующий:
TYPE |
ТОВАР |
|
карандаш |
|
чернила |
3. Условие сравнения записывается с помощью операций сравнения: равно (=), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=), не равно (—1= или просто —•), не больше (—•>), не меньше (—•<).
Пример 5. Условия сравнения.
Запрос имен сотрудников, работающих в отделе игрушек и получающих зарплату больше 1800, выглядит так:
ЕМР |
ФИО |
ЗАРПЛАТА РУКОВОДИТЕЛЬ |
ОТДЕЛ |
|
Р. |
>1800 |
игрушки |
Результатом запроса является таблица вида:
ЕМР ФИО
Григорьев А.Н.
Томилов А.Н.
В операциях сравнения можно использовать и элементы примера. Пример 6. Сравнения с элементами примера.
Ниже приведен вид шаблона запроса выборки имен и зарплат сотрудников, получающих больше, чем Левин П.Г. По-другому запрос можно сформулировать так: «Пусть Левин П.Г. получает зарплату в количестве s. Найти всех сотрудников, получающих больше, чем s, и вывести их зарплаты». Порядок строк в шаблоне несущественен.
ЕМР |
ФИО |
ЗАРПЛАТА |
Р.R> s
Левин П.Г. |
s |
3. Реляционная модель данных |
91 |
Сотрудников, получающих больше Левина П.Г., в таблице ЕМР не оказалось (вероятно, таковым является Петров А.С., но из таблицы ЕМР нам этого не узнать). В подобных случаях результирующая таблица оказывается пустой:
ЕМР ФИО ЗАРПЛАТА
Условия в запросе могут задаваться по одному или по нескольким столбцам. При этом происходит объединение отдельных условий по схеме логического И (AND).
Пример 7. Объединение условий.
Для формулировки запроса выборки имен и зарплат служащих, получающих больше Левина П.Г. и работающих в отделе игрушек, достаточно в предыдущую запросную форму в первую строку столбца ОТДЕЛ вставить слово «игрушки».
Запрос вида: «Найти имена и зарплаты служащих, получающих больше, чем Белкин Б.Н., и работающих в отделе, продающем ручки», выглядит следующим образом:
ЕМР |
ФИО |
ЗАРПЛАТА |
РУКОВОДИТЕЛЬ |
ОТДЕЛ |
|
Р. |
R> s |
|
department |
|
Белкин Б.Н. |
s |
|
|
SALES |
ОТДЕЛ |
ТОВАР |
|
|
|
department |
ручка |
|
|
Результатом выполнения этого запроса будет таблица вида:
ЕМР |
ФИО |
ЗАРПЛАТА |
|
Левин П.Г. |
2200 |
|
Семин С.В. |
2200 |
Здесь элемент примера department связывает две исходные таблицы по полю ОТДЕЛ, а элемент примера s используется для связи условий выбора в рамках одной исходной таблицы ЕМР.
Пример 8. Запрос, в шаблоне которого имеются две связи.
Пусть необходимо найти всех служащих, получающих больше своих руководителей. Этот запрос с помощью элементов примеров можно сформулировать так: «Вывести всех служащих, чьи руководители являются head и кто
92 |
Часть 1. Основы построения баз данных |
получает больше, чем s, где s — зарплата head». Шаблон соответствующего запроса имеет следующий вид:
ЕМР |
ФИО |
ЗАРПЛАТА |
РУКОВОДИТЕЛЬ |
ОТДЕЛ |
|
Р. |
> s |
head |
|
|
head |
s |
|
|
Здесь элемент head используется для связи руководителя в первой строке шаблона и имени из второй строки, а элементу применяется для сравнения зарплат.
Для нашего примера результирующая таблица окажется такой:
ЕМР ФИО
Гофман В.Э.
В качестве условия выбора записей из таблиц можно использовать операцию отрицания.
Пример 9. Отбор с операцией отрицания.
Пусть необходимо вывести все отделы, продающие товары, не поставляемые компанией Pencraft. Этот запрос можно перефразировать: «Вывести названия отделов, продающих товары t, такие, что компания Pencraft не поставляет товары t».
SALES |
ОТДЕЛ |
ТОВАР |
Р.t
SUPPLY |
ТОВАР |
ПОСТАВЩИК |
|
-л t |
Pencraft |
Ответная таблица для сформулированного запроса имеет вид:
SALES ОТДЕЛ
хозтовары
косметика
игрушки
В случаях, когда условия отбора записей для выборки представляют большие выражения, которые неудобно или трудно задать в шаблоне, можно использовать блок условий. Он по виду напоминает пустой шаблон с одним полем и именем CONDITIONS. Блок условий предназначен для записи логических выражений.
Записанные в одном шаблоне логические выражения, в общем случае, могут включать в себя операции логического умножения (операция AND) и логического сложения (операция OR).