Файл: Тема 12. Язык исчисления с переменными на доменах QBE.pdf

Добавлен: 20.10.2018

Просмотров: 390

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Тема 12. Язык исчисления с переменными на доменах QBE 

Язык  QBE  (QUERY  BY  EXAMPLE)  основан  на  исчислении  с 

переменными на доменах, используется как язык запросов СУБД ACCESS.  

Будем  рассматривать  раннюю  версию  языка.  Ввод  запросов  и  выдача 

результатов производится  с помощью таблиц вида табл. 1. 

Таблица 1. Таблица запроса QBE. 

 

 

 

 

Таблицы формируются в интерактивном режиме. Выражения в столбцах 

таблицы могут содержать переменные на доменах, константы, арифметические 

операции. Они представляют условия запроса. Если выражению предшествует 

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

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

запроса. 

Пример.  

Выдать  значения  атрибутов  Название,  Товар,  Цена  всех  поставщиков, 

имеющих нужные покупателю Петрову товары. 

Так  как  запрос  касается  отношений  Поставщики  и  Заказы,  построим 

таблицы  этих  отношений  и  занесем  условие  запроса  в  соответствующие 

столбцы. В результате получим следующие таблицы: 

 

Заказы 

Фамилия 

Товар 

Количество 

 

Петров 

_спички 

 

 

 
 
 
 
 
 

Имя отношения  Атрибут

Атрибут

… 

[команды] 

[P][выражение]  [P][выражение]  … 

… 

… 

… 

… 

Поставщики  Название 

Адрес 

Товар 

Цена 

 

P. 

 

P._спички 

P. 


background image

Смысл  данного  запроса  состоит  в  том,  что  в  отношении  Заказы  ищутся 

кортежи  с  фамилией  Петров  и  некоторым  товаром,  например,  «спички».  Для 

каждого  такого  кортежа  в  отношении  Поставщики  ищутся  кортежи  с  тем  же 

самым товаром, и в результат включаются компоненты Название, Товар, Цена 

найденных кортежей. Таблицы представляют рассматриваемый запрос. 

Знак подчеркивания перед некоторым значением говорит о том, что оно 

является примером. В 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  вложенных 

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

кортежам в ее отношении.  


background image

После  очередного  присваивания  значений  кортежам-переменным 

проверяется  возможность  задания  значений  переменным  на  доменах.  Если 

удалось  получить  очередное  значение  переменных  на  доменах,  то 

предпринимается требуемое запросом действие (печать, модификация, …). 

Выражения в графах таблицы, кроме рассмотренных, могут также иметь 

форму  c , где   - сравнение, c - переменная на домене или константа. 

 Примеры запросов 

Пример.  

Выдать все заказы на сигареты, превышающие 5. 

Заказы 

Фамилия 

Товар 

Количество 

P. 

 

Сигареты 

>5 

 

Пример.  

Все заказы на сигареты большие, чем заказ Петрова. 

Заказы 

Фамилия 

Товар 

Количество 

 

Петров 

Сигареты 

_x 

P. 

 

Сигареты 

>_x 

 

Пример.  

Все заказы, превышающие заказы Петрова на те же товары 

Заказы 

Фамилия 

Товар 

Количество 

 

Петров 

_x 

_n 

P. 

 

_x 

>_n 

 

Используются  две  переменные:  _x  и  _n.  В  результат  выдаются  все 

кортежи отношения Заказы, для которых найдется кортеж с фамилией Петров, 

тем же самым товаром и меньшим количеством. 

Пример.  

Все заказы на товары, для которых есть поставщики, отличные от База1. 


background image

Заказы 

Фамилия 

Товар 

Количество 

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 

 


background image

 

ALL. _f 

P. _t_ 

 

 

CONDITIONS 

CNT.ALL._f > 2 

 

Здесь  _t_  -  группирование  по  полю  товар;  ALL._f  –  агрегатная  функция, 

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

товары, заказанные более двух раз. 

В запросах можно производить вычисления. 

Пример.  

Число заказов на спички. 

Заказы 

Фамилия 

Товар 

Количество 

 

P.CNT.ALL. 

Спички 

 

 

Для  вставки,  удаления,  модификации  строк  отношений  используются 

операции I., D., U.