Язык с очень странным названием Query-By-Example "Запрос по образцу" (QBE) основан на исчислении предикатов на доменах. Разработан он Мойше Злуфом в 1974-1975 гг. в фирме IBM. Как вы помните, основополагающая работа Кодда по реляционной алгебре появилась в 1970 году. Так что исчисление предикатов на доменах было реализовано в языке достаточно быстро.
Странное слово в названии "по образцу" объясняется тем, в общем, случайным обстоятельствам, что, по мнению М. Злуфа, неквалифицированному пользователю удобнее выбирать в качестве имен переменных какое-нибудь значение этой переменной. Например, в уже известной вам таблице emp доменную переменную в столбце ename можно назвать SMITH или KING или еще каким-нибудь значением из домена ename.
Заметим, что подчеркиванием в исходной версии QBE выделялись имена переменных. И еще одно чисто техническое замечание. Как вы помните, в SQL мы договорились обозначать служебные слова языка большими буквами, а имена таблиц и столбцов малыми. Здесь мы это правило будем нарушать потому, что в демонстрируемых реализациях для всех имен может использоваться верхний регистр. В основополагающих статьях М. Злуфа все имена изображаются большими буквами. В приводимых для сравнения записях инструкций SQL сохранены соглашения предыдущей лекции.
Язык QBE, как и другие языки баз данных, включает в себя два подъязыка:
Изобразительные средства QBE крайне лаконичны, что делает его доступным пользователям, не имеющим квалификации программиста. Причина в том, что QBE содержит неразрывно связанные две компоненты — графическую, представляющую шаблоны таблиц и блок условия, и вербальную, содержащую минимальный набор легко запоминаемых команд.
Как всегда, все проверяем самостоятельно. С этой целью вам предоставляется специально разработанное инструментальное средство. В конце лекции приведен пример запроса QBE в Microsoft Access. Настоятельно рекомендую воспользоваться предоставляемыми на сайте книги www.database-model-lang-struct-semantic.ru материалами по Access и проработать в нем несколько примеров. Это даст вам правильное представление о возможностях реализации языка.
Попадая в инструментальные средства, работающие в QBE, вы видите в старых (дографических) вариантах исходное изображение в виде пустого шаблона, в которое пользователь вводит имя таблицы (рисунок 9.1).
(рис 9.1) Исходный шаблон из первой работы Злуфа
В графическом интерфейсе предлагаемого вам инструментального средства появляется пустой прямоугольник (рисунок 9.2).
(рис 9.2) Исходный шаблон
Если таблица с указанным именем существует, появится полоса с двумя строками. В первой перечислены все столбцы таблицы, а вторая пустая. Пример шаблона для вызванной таблицы dept показан в таблице 9.1.
| dept | deptno | dname | Loc |
|---|---|---|---|
Нижние строки, пока пустые, предназначены для ввода команд, переменных и операций отношения. Что в них можно записать? Одну из ограниченного (это хорошо, что ограниченного) набора команд, а именно:
I. (insert) — включить;D. (delete) — удалить;U. (update) — обновить;P. (print) — печатать.Можно задавать константы, переменные и отношения.
Приведем пример запроса QBE (таблица 9.2) эквивалентного следующему SQL-запросу:
SELECT deptno FROM dept WHERE dname='SALES'
Можно несколько расширить список команд, но мы сделаем это позже. Что еще можно добавить во второй и последующих строках?
| dept | deptno | dname | loc |
|---|---|---|---|
| P. | SALES |
"SALES" в столбце dname на предыдущем рисунке означает условие "dname = 'SALES'".X_ это обозначение переменной X. При этом мы можем и не использовать имен образцов для задания переменных.">1000" в столбце sal таблицы emp означала бы условие "sal>1000". Условие "sal=1000" можно записать как "=1000" или как "1000".Результат запроса заданного в таблице 9.2 приведен в листинге 9.1.
Строк найдено: 1 Запрос: SELECT el.deptno FROM dept el WHERE el.dname = 'SALES' deptno 30
Выведем имена сотрудников, работающих в отделе 20 и получающих больше 2900. Запрос выглядит так — таблица 9.3.
| Запрос | ||||
|---|---|---|---|---|
| emp | ename | sal | mgr | deptno |
| P. | >2900 | 20 | ||
| Результат | ||||
Строк найдено: 3 Запрос: |
||||
SELECT el.ename FROM emp el WHERE e1.deptno=20 AND e1.sal>2900 |
||||
ename JONES SCOTT FORD |
||||
Обратите внимание на то, что в SQL псевдонимы автоматически проставляются для всех таблиц, используемых в запросе. Это особенность инструмента, но не QBE.
Для упорядочения вывода по возрастанию используется команда "АО.", а для вывода по убыванию "DO.". Это аналоги слов Ascending и Descending из фразы ORDER BY в SQL.
Упоминавшееся при изучении исчисления на доменах условие принадлежности доменного значения кортежу обозначается пользователем за счет помещения значений столбцов в схему таблицы, что учитывает транслятор.
Основное назначение переменных — создание соединений таблиц. С этой целью под списком имен таблиц можно поместить две или более строк, заполненных командами и условиями. Соединение организуется по двум столбцам одной или разных таблиц, в которых проставлены переменные с одинаковыми именами. Рассмотрим пример.
Реализуем соединение таблицы emp с собой и с таблицей dept в запросе: "Найти имена и зарплаты служащих, получающих больше, чем JAMES, и работающих в отделе продаж (SALES)" — рисунок 9.3, таблица 9.4.
(рис 9.3) Запрос с соединением трех таблиц
| Результат | ||
|---|---|---|
Строк найдено: 5 Запрос: |
||
SELECT e1.ename,e1.sal FROM emp e1,emp e2,dept e3 WHERE e1.sal>e2.sal AND e1.deptno=e3.deptno AND e2.dname='SALES' AND e2.ename='JAMES' |
||
ename ALLEN WARD MARTIN BLAKE TURNER |
sal 1600 1250 1250 2850 1500 |
|
Читаем первую строку команд и условий для emp: "Выбрать значения столбцов ename и sal из таблицы emp. Значение в столбце sal использовать для организации соединения. Значение в столбце deptno использовать в другом соединении". Из сравнения с текстом SQL-запроса видно, что первой строке запроса QBE соответствует первый экземпляр таблицы emp с псевдонимом el. Во второй строке для emp указано, что необходимо выбрать из emp строку для Джеймса и оставить в первом результате только строки, в которых значение зарплаты SALES больше, чем у Джеймса. Эта строка запроса QBE соответствует псевдониму e2 запроса SQL. И, наконец, в условии для dept устанавливается, что выбирается только строка отдела продаж. Устанавливается соединение со строками, выбранными из emp, у которых значение в столбце deptno такое же, как в отделе продаж. Для записи соединения использована переменная _SALES_. В запросе SQL этой последней строке соответствует псевдоним e3.
Кстати, порядок записи двух или более строк с командами и условиями для одной таблицы значения не имеет. Это позволяет пользователю вводить текст в том порядке, как он обдумывается. Эквивалентный запрос на языке SQL, соответствующий исходному заданию:
SELECT el.ename, el.sal FROM emp el, emp e2, dept e3 WHERE e1.sal> e2.sal AND — соединения e1 и e2 e1.deptno=e3.deptno AND — соединение e1 и e3 e3.dname='SALES' AND — условие для e3 e2.ename='JAMES' — условие для e2
При необходимости распечатки отладочных данных достаточно проставить в нужной строке команды печати и прогнать на исполнение полученную версию.
В записи условия выбора можно работать с текстовыми шаблонами. Для этого часть литерала выделяют знаками подчеркивания в начале, середине или конце слова или предложения. В примере, приведенном ниже, запись A_LLEN_ в столбце ename означает, что ищутся значения, начинающиеся с "A", а _LLEN_ — это переменная с именем LLEN, включающая остальную часть слова. Шаблон _X_PA_Y_, означает слово или предложение, такие, что где-то в них содержатся последовательность букв "PA". Итак, наличие шаблона эквивалентно оператору LIKE в SQL. Это хорошо видно по следующему примеру в таблице 9.5
| Запрос | ||||
|---|---|---|---|---|
| emp | ename | sal | deptno | |
| P.A_LLEN_ | 30 | |||
| Результат | ||||
Строк найдено: 2 Запрос: |
||||
SELECT e1.ename,e1.deptno FROM emp el WHERE el.ename LIKE 'A%' |
||||
ename ALLEN ADAMS |
deptno 30 20 |
|||
Заметим, что переменные можно поместить в задании запроса в любых столбцах, как пустых, так и содержащих команды. В некоторых реализациях добавление переменной после команды P. обеспечивает вывод всех дублирующих значений, а переменные в столбцах без команды P. запрещают удаление соответствующих колонок в ответе.
Можно использовать отрицание запроса —. У нас отрицание обозначено "~". В следующем примере (таблица 9.6) требуется вывести имена всех сотрудников, не работающих в отделе продаж. Этот же запрос можно переписать с отрицанием условия — таблица 9.7.
| emp | ename | sal | deptno |
|---|---|---|---|
| P. | _DNO_ | ||
| dept | deptno | dname | loc |
| _DNO_ | SALES |
| emp | ename | sal | deptno |
|---|---|---|---|
| P. | _DNO_ | ||
| dept | deptno | dname | loc |
| _DNO_ | !=SALES |
Для того, чтобы в таблице-результате можно было иметь в заголовке имена столбцов, отличные от имен в исходных таблицах, в некоторых реализациях QBE создают шаблон результата, записывая в него нужные имена и связывая его с исходной таблицей или с соединением исходных таблиц.
Порядок таблиц и в этом случае несущественен. Объединение условий связками И и ИЛИ осуществляется за счет манипулирования переменными. Пример на применение связки И (таблица 9.8). Вывести имена сотрудников отдела 30 с зарплатой больше 1500, но меньше 3500.
| Запрос | ||||||||
|---|---|---|---|---|---|---|---|---|
| emp | ename | mgr | sal | deptno | ||||
| P._Name_ | P.>1500 | P. | ||||||
| _Name_ | <3500 | |||||||
| _Name_ | 30 | |||||||
| Результат | ||||||||
Строк найдено: 2 Запрос: |
||||||||
SELECT el.ename, el.sal, el.deptno FROM emp el, emp e2, emp e3 WHERE e1.ename=e2.ename AND e1.ename=e3.ename AND e1.sal>1500 AND e2.sal<3500 AND e3.deptno=30 |
||||||||
ename ALLEN BLAKE |
sal 1600 2850 |
deptno30 30 |
||||||
Обратите внимание на то, что при реализации логической связки И во всех трех строках использовано одно имя переменной _Name_ в одном и том же столбце. Отметим, что условие "=30" можно было перенести в первую строку сократив, тем самым, запрос. Использование разных переменных позволяет включить связку ИЛИ. В качестве примера, выведем имена сотрудников, зарплата которых составляет $10000, $13000 или $16000 (таблица 9.9).
| emp | name | sal |
| P._JONES_ | 10000 | |
| P._LEWIS_ | 13000 | |
| P._HENRY_ | 16000 |
В блоке условий составляющие условия объединяют знаками (И) и |
(ИЛИ).
Для указания столбца, по которому производят группирование в исходном варианте QBE, его подчеркивают двойной чертой. В нашей программе для указания на группирование использована функция G. (таблица 9.10).
В QBE используются многострочные функции аналоги функций SQL и оператор ALL. Это CNT. (аналог COUNT), SUM., AVG., MIN., MAX., а также UN. (уникальный). Функция UN. может быть присоединена к CNT., SUM. или AVG.. Например, CNT. UN. означает подсчет только различающихся значений.
Пример: найти суммы зарплат по всем отделам.
| emp | ename | sal | deptno |
| P.SUM.ALL._S_ |
В QBE можно организовывать некоторые запросы в логике второго порядка. Как вы помните, в ней кванторы можно навешивать не только на переменные, но еще и на имена предикатов. А именам предикатов в реализациях реляционных баз соответствуют имена таблиц. В таких запросах можно, например, искать таблицу, в которой имеется какой-нибудь столбец, или искать таблицу, в одном из столбцов которой записан некто по фамилии SMITH и т.п.
Пример запроса в логике предикатов 2-го порядка: Выбрать все имена таблиц схемы:
P._TAB_
Переменная _TAB_ здесь заведомо может быть опущена. Если мы хотим организовать выдачу имен всех столбцов всех таблиц схемы, то команда должна быть записана так: P._TAB_P.. или P. P.:
P. P.
Легкость перехода к запросам в логике второго порядка можно для себя прояснить тем, что имя таблицы есть всего лишь первый элемент списка <имя_таблицы, имя_столбца+>, так что домен первой колонки как раз содержит имена таблиц, и нет принципиальной разницы с последующими столбцами. Знак "+" здесь означает, что имя_столбца может быть повторено один или большее число раз.
Заметим, что в реализациях QBE возможность запросов в логике второго порядка может отсутствовать. В SQL такие запросы можно организовать, используя таблицы или представления словаря.
В Query-by-Example существует два двухмерных объекта. Один из них — шаблон таблицы — уже описан. Другой — это блок условий, имеющий всегда заголовок CONDITIONS. Пустой блок условий может быть выведен в любое время. Он позволяет задать одно или несколько условий, которые трудно выразить в шаблонах таблиц.
Пример (таблица 9.11): Вывести имена и зарплаты сотрудников, зарплата которых больше суммы зарплат Джонса и Аллена. Естественно, это простое условие могло быть выражено заменой в первой строке таблицы emp в столбце sal переменной _S1_ на условие ">(_S2_+_S3_)". Внесение сложных формул непосредственно в форму для таблицы, как минимум, неудобно.
| emp | ename | sal |
| P. | P._S1_ | |
| JONES | _S2_ | |
| ALLEN | _S3_ | |
| CONDITIONS | ||
_S1_>(_S2_+_S3_) |
||
Подъязык DML как и в SQL представлен тремя командами —вставка (I.), удаление (D.) и обновление (U.). Пример вставки строки приведен в таблице 9.12.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| I. | JONES | 7638 | 43550 | 40 |
Удалим из emp всех сотрудников отдела 40 (таблица 9.13)
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| D. | 40 |
Более сложный пример удаления всех сотрудников, работающих в отделе продаж (таблица 9.14) требует использования подзапросов. Подзапросы можно использовать и в командах обновления.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| D. | _D_ | |||
| dept | deptno | dname | loc | |
| _D_ | SALES | |||
Обновление записей понимается несколько труднее. Для примера с командой U. (таблица 9.15) необходимо пояснить, что столбец ename образует первичный ключ и не может быть изменен. Поэтому значение "ALLEN" понимается транслятором как условие поиска строк, а значение 3050 действительно заменяет старое значение заработной платы.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| U. | ALLEN | U.3050 |
Покажем на примере (таблица 9.16), как создается таблица с именем newtab и столбцами name, sal, mgr, dept. Начав с пустого шаблона, пользователь заполняет заголовки именами полей. Команда I. перед именем таблицы newtab означает "создать таблицу с именем newtab". Команда I. справа от newtab относится ко всей строке заголовков столбцов.
| I.newtab I. | name | sal | mgr | dept |
| TYPE I. | %String | %Integer | %Integer | %Integer |
| LENGTH I. | 30 | 5 | 4 | 2 |
| KEY | K | NK | NK | NK |
После задания имен столбцов необходимо определить базовые типы данных, их длину и проставить признак ключа.
В нашем инструменте свойства столбцов определяют всего три строки:
TYPE задает тип данных. В нашем инструменте используются типы принятые в COS;LENGTH задает ширину поля;KEY указывает поля первичного ключа (значение K это Key - ключ, NK это NonKey - не ключ).В других реализациях используются еще две строки:
DOMAIN — имя доменаSYSNULL (System Null) задает необязательный символ, обозначающий null-значение.Возможны изменения таблиц. Для того, чтобы добавить столбец, достаточно вызвать описание таблицы и командой имя_столбца добавить столбец, описав его свойства. Удаление столбца производится командой D. Можно переименовывать столбцы (таблица 9.17)
| tabl | U.sal=salary |
Покажем, как создается представление (view) по имени st со столбцами name и dname (таблица 9.18)
| I.view st I. | name | dname | ||
| I. | _N_ | _DN_ | ||
| emp | ename | mgr | sal | deptno |
| _N_ | _D_ | |||
| dept | deptno | dname | loc | |
| _D_ | _DN_ | |||
SQL-аналог этого представления:
CREATE VIEW st (name, dname) AS SELECT name, dname FROM emp, dept WHERE emp.deptno=dept.deptno
Из-за легкости усвоения QBE распространен довольно широко. Он используется в Microsoft Access, в СУБД Base OpenOffice, встроен во многие средства для разработки информационных систем, например, Hibernate. Существуют отдельные программы, предоставляющие язык QBE для широкого круга баз данных, использующих интерфейсы ODBC или JDBC.
На (рисунке 9.4 вы найдете пример интерфейса QBE для Microsoft Access.
(рис 9.4) QBE в Microsoft Access
Вы теперь самостоятельно можете понять, какой запрос представлен на последнем рисунке. Как видите, знание основных принципов построения графического интерфейса QBE позволяет легко разобраться с незнакомой ранее реализацией.
То, что QBE —это язык, основанный на исчислении предикатов на доменах, мы уже отметили. Естественно, он обладает свойством реляционной полноты.
Важнее другая его особенность. В QBE неразрывно соединены две компоненты — графическая и вербальная. Первая образуется динамической системой шаблонов, представляющих фрагмент схемы базы необходимый для решения конкретной задачи. Поля шаблонов могут быть заполнены командами, переменными и условиями выбора и соединения, представляющими вербальную компоненту языка. И мы видели, что такое сочетание вербальной и графической компонент в одном языке может быть весьма удобным.
Наверное, лингвист сказал бы, что SQL, в отличие от QBE, чисто вербальный язык. Любая возможная инструкция в нем есть одномерная последовательность слов (цепочка). Возможные структуры этих цепочек описываются некоторой грамматикой.
И еще. В используемом вами инструменте постоянно предлагался эквивалент команды на языке SQL. Это делается чисто в учебных целях, чтобы связать в вашем представлении оба языка. Конечно, QBE можно транслировать в SQL. Но отсюда не следует, что QBE —это такой способ представления SQL. Например, в Cache можно транслировать команды QBE в COS-процедуры, предназначенные для работы с глобалами, хранящими данные таблиц. В большинстве других СУБД пользователь не может написать подобный транслятор из-за того, что не имеет доступа к структурам хранения на низком уровне.
Что шире SQL или QBE? В последних версиях SQL существенно шире. Например, в нашем инструментальном средстве для QBE эквивалента UNION нет.
Есть веские основания полагать, что QBE никогда не догонит SQL. Дело в том, что графические компоненты чрезвычайно удобны, но существенно ограничены. Слишком сложные образы только затрудняют восприятие.
Язык с очень странным названием Query-By-Example "Запрос по образцу" (QBE) основан на исчислении предикатов на доменах. Разработан он Мойше Злуфом в 1974-1975 гг. в фирме IBM. Как вы помните, основополагающая работа Кодда по реляционной алгебре появилась в 1970 году. Так что исчисление предикатов на доменах было реализовано в языке достаточно быстро.
Странное слово в названии "по образцу" объясняется тем, в общем, случайным обстоятельствам, что, по мнению М. Злуфа, неквалифицированному пользователю удобнее выбирать в качестве имен переменных какое-нибудь значение этой переменной. Например, в уже известной вам таблице emp доменную переменную в столбце ename можно назвать SMITH или KING или еще каким-нибудь значением из домена ename.
Заметим, что подчеркиванием в исходной версии QBE выделялись имена переменных. И еще одно чисто техническое замечание. Как вы помните, в SQL мы договорились обозначать служебные слова языка большими буквами, а имена таблиц и столбцов малыми. Здесь мы это правило будем нарушать потому, что в демонстрируемых реализациях для всех имен может использоваться верхний регистр. В основополагающих статьях М. Злуфа все имена изображаются большими буквами. В приводимых для сравнения записях инструкций SQL сохранены соглашения предыдущей лекции.
Язык QBE, как и другие языки баз данных, включает в себя два подъязыка:
Изобразительные средства QBE крайне лаконичны, что делает его доступным пользователям, не имеющим квалификации программиста. Причина в том, что QBE содержит неразрывно связанные две компоненты — графическую, представляющую шаблоны таблиц и блок условия, и вербальную, содержащую минимальный набор легко запоминаемых команд.
Как всегда, все проверяем самостоятельно. С этой целью вам предоставляется специально разработанное инструментальное средство. В конце лекции приведен пример запроса QBE в Microsoft Access. Настоятельно рекомендую воспользоваться предоставляемыми на сайте книги www.database-model-lang-struct-semantic.ru материалами по Access и проработать в нем несколько примеров. Это даст вам правильное представление о возможностях реализации языка.
Попадая в инструментальные средства, работающие в QBE, вы видите в старых (дографических) вариантах исходное изображение в виде пустого шаблона, в которое пользователь вводит имя таблицы (рисунок 9.1).
(рис 9.1) Исходный шаблон из первой работы Злуфа
В графическом интерфейсе предлагаемого вам инструментального средства появляется пустой прямоугольник (рисунок 9.2).
(рис 9.2) Исходный шаблон
Если таблица с указанным именем существует, появится полоса с двумя строками. В первой перечислены все столбцы таблицы, а вторая пустая. Пример шаблона для вызванной таблицы dept показан в таблице 9.1.
| dept | deptno | dname | Loc |
|---|---|---|---|
Нижние строки, пока пустые, предназначены для ввода команд, переменных и операций отношения. Что в них можно записать? Одну из ограниченного (это хорошо, что ограниченного) набора команд, а именно:
I. (insert) — включить;D. (delete) — удалить;U. (update) — обновить;P. (print) — печатать.Можно задавать константы, переменные и отношения.
Приведем пример запроса QBE (таблица 9.2) эквивалентного следующему SQL-запросу:
SELECT deptno FROM dept WHERE dname='SALES'
Можно несколько расширить список команд, но мы сделаем это позже. Что еще можно добавить во второй и последующих строках?
| dept | deptno | dname | loc |
|---|---|---|---|
| P. | SALES |
"SALES" в столбце dname на предыдущем рисунке означает условие "dname = 'SALES'".X_ это обозначение переменной X. При этом мы можем и не использовать имен образцов для задания переменных.">1000" в столбце sal таблицы emp означала бы условие "sal>1000". Условие "sal=1000" можно записать как "=1000" или как "1000".Результат запроса заданного в таблице 9.2 приведен в листинге 9.1.
Строк найдено: 1 Запрос: SELECT el.deptno FROM dept el WHERE el.dname = 'SALES' deptno 30
Выведем имена сотрудников, работающих в отделе 20 и получающих больше 2900. Запрос выглядит так — таблица 9.3.
| Запрос | ||||
|---|---|---|---|---|
| emp | ename | sal | mgr | deptno |
| P. | >2900 | 20 | ||
| Результат | ||||
Строк найдено: 3 Запрос: |
||||
SELECT el.ename FROM emp el WHERE e1.deptno=20 AND e1.sal>2900 |
||||
ename JONES SCOTT FORD |
||||
Обратите внимание на то, что в SQL псевдонимы автоматически проставляются для всех таблиц, используемых в запросе. Это особенность инструмента, но не QBE.
Для упорядочения вывода по возрастанию используется команда "АО.", а для вывода по убыванию "DO.". Это аналоги слов Ascending и Descending из фразы ORDER BY в SQL.
Упоминавшееся при изучении исчисления на доменах условие принадлежности доменного значения кортежу обозначается пользователем за счет помещения значений столбцов в схему таблицы, что учитывает транслятор.
Основное назначение переменных — создание соединений таблиц. С этой целью под списком имен таблиц можно поместить две или более строк, заполненных командами и условиями. Соединение организуется по двум столбцам одной или разных таблиц, в которых проставлены переменные с одинаковыми именами. Рассмотрим пример.
Реализуем соединение таблицы emp с собой и с таблицей dept в запросе: "Найти имена и зарплаты служащих, получающих больше, чем JAMES, и работающих в отделе продаж (SALES)" — рисунок 9.3, таблица 9.4.
(рис 9.3) Запрос с соединением трех таблиц
| Результат | ||
|---|---|---|
Строк найдено: 5 Запрос: |
||
SELECT e1.ename,e1.sal FROM emp e1,emp e2,dept e3 WHERE e1.sal>e2.sal AND e1.deptno=e3.deptno AND e2.dname='SALES' AND e2.ename='JAMES' |
||
ename ALLEN WARD MARTIN BLAKE TURNER |
sal 1600 1250 1250 2850 1500 |
|
Читаем первую строку команд и условий для emp: "Выбрать значения столбцов ename и sal из таблицы emp. Значение в столбце sal использовать для организации соединения. Значение в столбце deptno использовать в другом соединении". Из сравнения с текстом SQL-запроса видно, что первой строке запроса QBE соответствует первый экземпляр таблицы emp с псевдонимом el. Во второй строке для emp указано, что необходимо выбрать из emp строку для Джеймса и оставить в первом результате только строки, в которых значение зарплаты SALES больше, чем у Джеймса. Эта строка запроса QBE соответствует псевдониму e2 запроса SQL. И, наконец, в условии для dept устанавливается, что выбирается только строка отдела продаж. Устанавливается соединение со строками, выбранными из emp, у которых значение в столбце deptno такое же, как в отделе продаж. Для записи соединения использована переменная _SALES_. В запросе SQL этой последней строке соответствует псевдоним e3.
Кстати, порядок записи двух или более строк с командами и условиями для одной таблицы значения не имеет. Это позволяет пользователю вводить текст в том порядке, как он обдумывается. Эквивалентный запрос на языке SQL, соответствующий исходному заданию:
SELECT el.ename, el.sal FROM emp el, emp e2, dept e3 WHERE e1.sal> e2.sal AND — соединения e1 и e2 e1.deptno=e3.deptno AND — соединение e1 и e3 e3.dname='SALES' AND — условие для e3 e2.ename='JAMES' — условие для e2
При необходимости распечатки отладочных данных достаточно проставить в нужной строке команды печати и прогнать на исполнение полученную версию.
В записи условия выбора можно работать с текстовыми шаблонами. Для этого часть литерала выделяют знаками подчеркивания в начале, середине или конце слова или предложения. В примере, приведенном ниже, запись A_LLEN_ в столбце ename означает, что ищутся значения, начинающиеся с "A", а _LLEN_ — это переменная с именем LLEN, включающая остальную часть слова. Шаблон _X_PA_Y_, означает слово или предложение, такие, что где-то в них содержатся последовательность букв "PA". Итак, наличие шаблона эквивалентно оператору LIKE в SQL. Это хорошо видно по следующему примеру в таблице 9.5
| Запрос | ||||
|---|---|---|---|---|
| emp | ename | sal | deptno | |
| P.A_LLEN_ | 30 | |||
| Результат | ||||
Строк найдено: 2 Запрос: |
||||
SELECT e1.ename,e1.deptno FROM emp el WHERE el.ename LIKE 'A%' |
||||
ename ALLEN ADAMS |
deptno 30 20 |
|||
Заметим, что переменные можно поместить в задании запроса в любых столбцах, как пустых, так и содержащих команды. В некоторых реализациях добавление переменной после команды P. обеспечивает вывод всех дублирующих значений, а переменные в столбцах без команды P. запрещают удаление соответствующих колонок в ответе.
Можно использовать отрицание запроса —. У нас отрицание обозначено "~". В следующем примере (таблица 9.6) требуется вывести имена всех сотрудников, не работающих в отделе продаж. Этот же запрос можно переписать с отрицанием условия — таблица 9.7.
| emp | ename | sal | deptno |
|---|---|---|---|
| P. | _DNO_ | ||
| dept | deptno | dname | loc |
| _DNO_ | SALES |
| emp | ename | sal | deptno |
|---|---|---|---|
| P. | _DNO_ | ||
| dept | deptno | dname | loc |
| _DNO_ | !=SALES |
Для того, чтобы в таблице-результате можно было иметь в заголовке имена столбцов, отличные от имен в исходных таблицах, в некоторых реализациях QBE создают шаблон результата, записывая в него нужные имена и связывая его с исходной таблицей или с соединением исходных таблиц.
Порядок таблиц и в этом случае несущественен. Объединение условий связками И и ИЛИ осуществляется за счет манипулирования переменными. Пример на применение связки И (таблица 9.8). Вывести имена сотрудников отдела 30 с зарплатой больше 1500, но меньше 3500.
| Запрос | ||||||||
|---|---|---|---|---|---|---|---|---|
| emp | ename | mgr | sal | deptno | ||||
| P._Name_ | P.>1500 | P. | ||||||
| _Name_ | <3500 | |||||||
| _Name_ | 30 | |||||||
| Результат | ||||||||
Строк найдено: 2 Запрос: |
||||||||
SELECT el.ename, el.sal, el.deptno FROM emp el, emp e2, emp e3 WHERE e1.ename=e2.ename AND e1.ename=e3.ename AND e1.sal>1500 AND e2.sal<3500 AND e3.deptno=30 |
||||||||
ename ALLEN BLAKE |
sal 1600 2850 |
deptno30 30 |
||||||
Обратите внимание на то, что при реализации логической связки И во всех трех строках использовано одно имя переменной _Name_ в одном и том же столбце. Отметим, что условие "=30" можно было перенести в первую строку сократив, тем самым, запрос. Использование разных переменных позволяет включить связку ИЛИ. В качестве примера, выведем имена сотрудников, зарплата которых составляет $10000, $13000 или $16000 (таблица 9.9).
| emp | name | sal |
| P._JONES_ | 10000 | |
| P._LEWIS_ | 13000 | |
| P._HENRY_ | 16000 |
В блоке условий составляющие условия объединяют знаками (И) и |
(ИЛИ).
Для указания столбца, по которому производят группирование в исходном варианте QBE, его подчеркивают двойной чертой. В нашей программе для указания на группирование использована функция G. (таблица 9.10).
В QBE используются многострочные функции аналоги функций SQL и оператор ALL. Это CNT. (аналог COUNT), SUM., AVG., MIN., MAX., а также UN. (уникальный). Функция UN. может быть присоединена к CNT., SUM. или AVG.. Например, CNT. UN. означает подсчет только различающихся значений.
Пример: найти суммы зарплат по всем отделам.
| emp | ename | sal | deptno |
| P.SUM.ALL._S_ |
В QBE можно организовывать некоторые запросы в логике второго порядка. Как вы помните, в ней кванторы можно навешивать не только на переменные, но еще и на имена предикатов. А именам предикатов в реализациях реляционных баз соответствуют имена таблиц. В таких запросах можно, например, искать таблицу, в которой имеется какой-нибудь столбец, или искать таблицу, в одном из столбцов которой записан некто по фамилии SMITH и т.п.
Пример запроса в логике предикатов 2-го порядка: Выбрать все имена таблиц схемы:
P._TAB_
Переменная _TAB_ здесь заведомо может быть опущена. Если мы хотим организовать выдачу имен всех столбцов всех таблиц схемы, то команда должна быть записана так: P._TAB_P.. или P. P.:
P. P.
Легкость перехода к запросам в логике второго порядка можно для себя прояснить тем, что имя таблицы есть всего лишь первый элемент списка <имя_таблицы, имя_столбца+>, так что домен первой колонки как раз содержит имена таблиц, и нет принципиальной разницы с последующими столбцами. Знак "+" здесь означает, что имя_столбца может быть повторено один или большее число раз.
Заметим, что в реализациях QBE возможность запросов в логике второго порядка может отсутствовать. В SQL такие запросы можно организовать, используя таблицы или представления словаря.
В Query-by-Example существует два двухмерных объекта. Один из них — шаблон таблицы — уже описан. Другой — это блок условий, имеющий всегда заголовок CONDITIONS. Пустой блок условий может быть выведен в любое время. Он позволяет задать одно или несколько условий, которые трудно выразить в шаблонах таблиц.
Пример (таблица 9.11): Вывести имена и зарплаты сотрудников, зарплата которых больше суммы зарплат Джонса и Аллена. Естественно, это простое условие могло быть выражено заменой в первой строке таблицы emp в столбце sal переменной _S1_ на условие ">(_S2_+_S3_)". Внесение сложных формул непосредственно в форму для таблицы, как минимум, неудобно.
| emp | ename | sal |
| P. | P._S1_ | |
| JONES | _S2_ | |
| ALLEN | _S3_ | |
| CONDITIONS | ||
_S1_>(_S2_+_S3_) |
||
Подъязык DML как и в SQL представлен тремя командами —вставка (I.), удаление (D.) и обновление (U.). Пример вставки строки приведен в таблице 9.12.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| I. | JONES | 7638 | 43550 | 40 |
Удалим из emp всех сотрудников отдела 40 (таблица 9.13)
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| D. | 40 |
Более сложный пример удаления всех сотрудников, работающих в отделе продаж (таблица 9.14) требует использования подзапросов. Подзапросы можно использовать и в командах обновления.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| D. | _D_ | |||
| dept | deptno | dname | loc | |
| _D_ | SALES | |||
Обновление записей понимается несколько труднее. Для примера с командой U. (таблица 9.15) необходимо пояснить, что столбец ename образует первичный ключ и не может быть изменен. Поэтому значение "ALLEN" понимается транслятором как условие поиска строк, а значение 3050 действительно заменяет старое значение заработной платы.
| emp | ename | mgr | sal | deptno |
|---|---|---|---|---|
| U. | ALLEN | U.3050 |
Покажем на примере (таблица 9.16), как создается таблица с именем newtab и столбцами name, sal, mgr, dept. Начав с пустого шаблона, пользователь заполняет заголовки именами полей. Команда I. перед именем таблицы newtab означает "создать таблицу с именем newtab". Команда I. справа от newtab относится ко всей строке заголовков столбцов.
| I.newtab I. | name | sal | mgr | dept |
| TYPE I. | %String | %Integer | %Integer | %Integer |
| LENGTH I. | 30 | 5 | 4 | 2 |
| KEY | K | NK | NK | NK |
После задания имен столбцов необходимо определить базовые типы данных, их длину и проставить признак ключа.
В нашем инструменте свойства столбцов определяют всего три строки:
TYPE задает тип данных. В нашем инструменте используются типы принятые в COS;LENGTH задает ширину поля;KEY указывает поля первичного ключа (значение K это Key - ключ, NK это NonKey - не ключ).В других реализациях используются еще две строки:
DOMAIN — имя доменаSYSNULL (System Null) задает необязательный символ, обозначающий null-значение.Возможны изменения таблиц. Для того, чтобы добавить столбец, достаточно вызвать описание таблицы и командой имя_столбца добавить столбец, описав его свойства. Удаление столбца производится командой D. Можно переименовывать столбцы (таблица 9.17)
| tabl | U.sal=salary |
Покажем, как создается представление (view) по имени st со столбцами name и dname (таблица 9.18)
| I.view st I. | name | dname | ||
| I. | _N_ | _DN_ | ||
| emp | ename | mgr | sal | deptno |
| _N_ | _D_ | |||
| dept | deptno | dname | loc | |
| _D_ | _DN_ | |||
SQL-аналог этого представления:
CREATE VIEW st (name, dname) AS SELECT name, dname FROM emp, dept WHERE emp.deptno=dept.deptno
Из-за легкости усвоения QBE распространен довольно широко. Он используется в Microsoft Access, в СУБД Base OpenOffice, встроен во многие средства для разработки информационных систем, например, Hibernate. Существуют отдельные программы, предоставляющие язык QBE для широкого круга баз данных, использующих интерфейсы ODBC или JDBC.
На (рисунке 9.4 вы найдете пример интерфейса QBE для Microsoft Access.
(рис 9.4) QBE в Microsoft Access
Вы теперь самостоятельно можете понять, какой запрос представлен на последнем рисунке. Как видите, знание основных принципов построения графического интерфейса QBE позволяет легко разобраться с незнакомой ранее реализацией.
То, что QBE —это язык, основанный на исчислении предикатов на доменах, мы уже отметили. Естественно, он обладает свойством реляционной полноты.
Важнее другая его особенность. В QBE неразрывно соединены две компоненты — графическая и вербальная. Первая образуется динамической системой шаблонов, представляющих фрагмент схемы базы необходимый для решения конкретной задачи. Поля шаблонов могут быть заполнены командами, переменными и условиями выбора и соединения, представляющими вербальную компоненту языка. И мы видели, что такое сочетание вербальной и графической компонент в одном языке может быть весьма удобным.
Наверное, лингвист сказал бы, что SQL, в отличие от QBE, чисто вербальный язык. Любая возможная инструкция в нем есть одномерная последовательность слов (цепочка). Возможные структуры этих цепочек описываются некоторой грамматикой.
И еще. В используемом вами инструменте постоянно предлагался эквивалент команды на языке SQL. Это делается чисто в учебных целях, чтобы связать в вашем представлении оба языка. Конечно, QBE можно транслировать в SQL. Но отсюда не следует, что QBE —это такой способ представления SQL. Например, в Cache можно транслировать команды QBE в COS-процедуры, предназначенные для работы с глобалами, хранящими данные таблиц. В большинстве других СУБД пользователь не может написать подобный транслятор из-за того, что не имеет доступа к структурам хранения на низком уровне.
Что шире SQL или QBE? В последних версиях SQL существенно шире. Например, в нашем инструментальном средстве для QBE эквивалента UNION нет.
Есть веские основания полагать, что QBE никогда не догонит SQL. Дело в том, что графические компоненты чрезвычайно удобны, но существенно ограничены. Слишком сложные образы только затрудняют восприятие.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.