Файл: Тема 12. Язык исчисления с переменными на доменах QBE.pdf
Добавлен: 20.10.2018
Просмотров: 469
Скачиваний: 6
Тема 12. Язык исчисления с переменными на доменах QBE
Язык QBE (QUERY BY EXAMPLE) основан на исчислении с
переменными на доменах, используется как язык запросов СУБД ACCESS.
Будем рассматривать раннюю версию языка. Ввод запросов и выдача
результатов производится с помощью таблиц вида табл. 1.
Таблица 1. Таблица запроса QBE.
Таблицы формируются в интерактивном режиме. Выражения в столбцах
таблицы могут содержать переменные на доменах, константы, арифметические
операции. Они представляют условия запроса. Если выражению предшествует
префикс P, то значение соответствующего столбца помещается в результат. В
результат попадают кортежи или их комбинации, отвечающие условию
запроса.
Пример.
Выдать значения атрибутов Название, Товар, Цена всех поставщиков,
имеющих нужные покупателю Петрову товары.
Так как запрос касается отношений Поставщики и Заказы, построим
таблицы этих отношений и занесем условие запроса в соответствующие
столбцы. В результате получим следующие таблицы:
Заказы
Фамилия
Товар
Количество
Петров
_спички
Имя отношения Атрибут
1
Атрибут
2
…
[команды]
[P][выражение] [P][выражение] …
…
…
…
…
Поставщики Название
Адрес
Товар
Цена
P.
P._спички
P.
Смысл данного запроса состоит в том, что в отношении Заказы ищутся
кортежи с фамилией Петров и некоторым товаром, например, «спички». Для
каждого такого кортежа в отношении Поставщики ищутся кортежи с тем же
самым товаром, и в результат включаются компоненты Название, Товар, Цена
найденных кортежей. Таблицы представляют рассматриваемый запрос.
Знак подчеркивания перед некоторым значением говорит о том, что оно
является примером. В QBE примеры используются как переменные на доменах.
Условия запроса таблицы «Заказы» заданы во второй строке. Этими условиями
являются фамилия «Петров» и переменная на домене _спички. Условие запроса
таблицы «Поставщики» состоит из переменной на домене в колонке «Товар».
Равенство выражений в колонках «Товар» обоих таблиц говорит о равенстве
значений соответствующих компонентов. То есть в таблицу «Поставщики»
будут включаться только те кортежи, компонент Товар которых совпадает с
одним из заказов Петрова. Оператор P. указывает включаемые в результат
компоненты.
Многие запросы QBE соответствуют выражениям реляционного
исчисления с переменными на доменах вида:
))},
,...
,
(
&
...
&
)
,...
,
(
)(
)...(
)(
(
|
,...
,
{
2
1
1
12
11
1
2
1
2
1
1
p
pk
p
p
p
k
m
n
c
c
c
R
c
c
c
R
b
b
b
a
a
a
где каждое c
ij
есть некоторое a
l
, b
k
или константа. Чтобы выразить такой запрос
показываются макеты таблиц для всех отношений R
1
,…R
p
и создаются имена
переменных для каждого из a
l
, b
k
. Далее для каждого отношения R
i
записывается кортеж-запрос. Если c
ij
- константа, помещаем ее в j-ый
компонент. Если c
ij
является a
l
или b
k
, помещаем туда соответствующую
переменную.
Общее правило реализации запроса в QBE состоит в том, что создается
переменная-кортеж для каждой строки, входящей в таблицы существующих
отношений. Если имеется k таких переменных, то формируется k вложенных
циклов. Каждый цикл заставляет одну из переменных пробегать по всем
кортежам в ее отношении.
После очередного присваивания значений кортежам-переменным
проверяется возможность задания значений переменным на доменах. Если
удалось получить очередное значение переменных на доменах, то
предпринимается требуемое запросом действие (печать, модификация, …).
Выражения в графах таблицы, кроме рассмотренных, могут также иметь
форму c , где - сравнение, c - переменная на домене или константа.
Примеры запросов
Пример.
Выдать все заказы на сигареты, превышающие 5.
Заказы
Фамилия
Товар
Количество
P.
Сигареты
>5
Пример.
Все заказы на сигареты большие, чем заказ Петрова.
Заказы
Фамилия
Товар
Количество
Петров
Сигареты
_x
P.
Сигареты
>_x
Пример.
Все заказы, превышающие заказы Петрова на те же товары
Заказы
Фамилия
Товар
Количество
Петров
_x
_n
P.
_x
>_n
Используются две переменные: _x и _n. В результат выдаются все
кортежи отношения Заказы, для которых найдется кортеж с фамилией Петров,
тем же самым товаром и меньшим количеством.
Пример.
Все заказы на товары, для которых есть поставщики, отличные от База1.
Заказы
Фамилия
Товар
Количество
P.
_x
Пример.
Все покупатели, баланс которых >50, <100 и не 75.
Покупатели
Фамилия
Адрес
Баланс
P.
_b
CONDITIONS
_b=(>50 & <100 & 75)
В данном примере использован блок условий – не связанный с
отношениями шаблон с одним столбцом CONDITIONS, в котором задается
условие.
Пример.
Все покупатели, баланс которых равен 100, 200 или 300.
Покупатели
Фамилия
Адрес
Баланс
P.
_b
CONDITIONS
_b=(100 | 200 | 300)
В условиях QBE могут использоваться агрегатные функции (CNT., SUM.,
AVG., MIN., MAX., UN., ALL.) и группирование множеств.
Пример.
Выдать названия товаров, для которых имеется более двух заказов.
Заказы
Фамилия
Товар
Количество
Поставщики Название
Адрес
Товар
Цена
База1
_x
ALL. _f
P. _t_
CONDITIONS
CNT.ALL._f > 2
Здесь _t_ - группирование по полю товар; ALL._f – агрегатная функция,
выдающая все вхождения фамилий в группу заказов. В результат включаются
товары, заказанные более двух раз.
В запросах можно производить вычисления.
Пример.
Число заказов на спички.
Заказы
Фамилия
Товар
Количество
P.CNT.ALL.
Спички
Для вставки, удаления, модификации строк отношений используются
операции I., D., U.