Язык QBE (Query-by-example)
9.3 Подъязык DML
Подъязык DML как и в SQL представлен тремя командами —вставка (I.), удаление (D.) и обновление (U.). Пример вставки строки приведен в таблице 9.12.
Удалим из emp всех сотрудников отдела 40 (таблица 9.13)
Более сложный пример удаления всех сотрудников, работающих в отделе продаж (таблица 9.14) требует использования подзапросов. Подзапросы можно использовать и в командах обновления.
emp | ename | mgr | sal | deptno |
---|---|---|---|---|
D. | _D_ | |||
dept | deptno | dname | loc | |
_D_ | SALES |
Обновление записей понимается несколько труднее. Для примера с командой U. (таблица 9.15) необходимо пояснить, что столбец ename образует первичный ключ и не может быть изменен. Поэтому значение "ALLEN" понимается транслятором как условие поиска строк, а значение 3050 действительно заменяет старое значение заработной платы.
9.4 Создание таблицы
Покажем на примере (таблица 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)
Покажем, как создается представление (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
9.5 QBE в системах управления базами данных
Из-за легкости усвоения QBE распространен довольно широко. Он используется в Microsoft Access, в СУБД Base OpenOffice, встроен во многие средства для разработки информационных систем, например, Hibernate. Существуют отдельные программы, предоставляющие язык QBE для широкого круга баз данных, использующих интерфейсы ODBC или JDBC.
На (рисунке 9.4 вы найдете пример интерфейса QBE для Microsoft Access.
Вы теперь самостоятельно можете понять, какой запрос представлен на последнем рисунке. Как видите, знание основных принципов построения графического интерфейса QBE позволяет легко разобраться с незнакомой ранее реализацией.
9.6 Так что такое QBE?
То, что QBE —это язык, основанный на исчислении предикатов на доменах, мы уже отметили. Естественно, он обладает свойством реляционной полноты.
Важнее другая его особенность. В QBE неразрывно соединены две компоненты — графическая и вербальная. Первая образуется динамической системой шаблонов, представляющих фрагмент схемы базы необходимый для решения конкретной задачи. Поля шаблонов могут быть заполнены командами, переменными и условиями выбора и соединения, представляющими вербальную компоненту языка. И мы видели, что такое сочетание вербальной и графической компонент в одном языке может быть весьма удобным.
Наверное, лингвист сказал бы, что SQL, в отличие от QBE, чисто вербальный язык. Любая возможная инструкция в нем есть одномерная последовательность слов (цепочка). Возможные структуры этих цепочек описываются некоторой грамматикой.
И еще. В используемом вами инструменте постоянно предлагался эквивалент команды на языке SQL. Это делается чисто в учебных целях, чтобы связать в вашем представлении оба языка. Конечно, QBE можно транслировать в SQL. Но отсюда не следует, что QBE —это такой способ представления SQL. Например, в Cache можно транслировать команды QBE в COS-процедуры, предназначенные для работы с глобалами, хранящими данные таблиц. В большинстве других СУБД пользователь не может написать подобный транслятор из-за того, что не имеет доступа к структурам хранения на низком уровне.
Что шире SQL или QBE? В последних версиях SQL существенно шире. Например, в нашем инструментальном средстве для QBE эквивалента UNION нет.
Есть веские основания полагать, что QBE никогда не догонит SQL. Дело в том, что графические компоненты чрезвычайно удобны, но существенно ограничены. Слишком сложные образы только затрудняют восприятие.