Модели и смыслы данных в Cache и Oracle

Язык QBE (Query-by-example)

Разбить на страницы
Показывать лекцию целиком

Язык с очень странным названием Query-By-Example "Запрос по образцу" (QBE) основан на исчислении предикатов на доменах. Разработан он Мойше Злуфом в 1974-1975 гг. в фирме IBM. Как вы помните, основополагающая работа Кодда по реляционной алгебре появилась в 1970 году. Так что исчисление предикатов на доменах было реализовано в языке достаточно быстро.

Странное слово в названии "по образцу" объясняется тем, в общем, случайным обстоятельствам, что, по мнению М. Злуфа, неквалифицированному пользователю удобнее выбирать в качестве имен переменных какое-нибудь значение этой переменной. Например, в уже известной вам таблице emp доменную переменную в столбце ename можно назвать SMITH или KING или еще каким-нибудь значением из домена ename.

Заметим, что подчеркиванием в исходной версии QBE выделялись имена переменных. И еще одно чисто техническое замечание. Как вы помните, в SQL мы договорились обозначать служебные слова языка большими буквами, а имена таблиц и столбцов малыми. Здесь мы это правило будем нарушать потому, что в демонстрируемых реализациях для всех имен может использоваться верхний регистр. В основополагающих статьях М. Злуфа все имена изображаются большими буквами. В приводимых для сравнения записях инструкций SQL сохранены соглашения предыдущей лекции.

9.1 Структура языка

Язык QBE, как и другие языки баз данных, включает в себя два подъязыка:

  • ЯОД —средства определения структур данных и ограничений целостности;
  • ЯМД — средства манипулирования данными и средства для написания запросов к базам данных. Язык управления данными отсутствует.
  • Изобразительные средства QBE крайне лаконичны, что делает его доступным пользователям, не имеющим квалификации программиста. Причина в том, что QBE содержит неразрывно связанные две компоненты — графическую, представляющую шаблоны таблиц и блок условия, и вербальную, содержащую минимальный набор легко запоминаемых команд.

    Как всегда, все проверяем самостоятельно. С этой целью вам предоставляется специально разработанное инструментальное средство. В конце лекции приведен пример запроса QBE в Microsoft Access. Настоятельно рекомендую воспользоваться предоставляемыми на сайте книги www.database-model-lang-struct-semantic.ru материалами по Access и проработать в нем несколько примеров. Это даст вам правильное представление о возможностях реализации языка.

    9.2 Основы QBE

    Попадая в инструментальные средства, работающие в QBE, вы видите в старых (дографических) вариантах исходное изображение в виде пустого шаблона, в которое пользователь вводит имя таблицы (рисунок 9.1).

    (рис 9.1) Исходный шаблон из первой работы Злуфа

    В графическом интерфейсе предлагаемого вам инструментального средства появляется пустой прямоугольник (рисунок 9.2).

    (рис 9.2) Исходный шаблон

    Если таблица с указанным именем существует, появится полоса с двумя строками. В первой перечислены все столбцы таблицы, а вторая пустая. Пример шаблона для вызванной таблицы dept показан в таблице 9.1.

    Шаблон для таблицы dept
    dept deptno dname Loc

    Нижние строки, пока пустые, предназначены для ввода команд, переменных и операций отношения. Что в них можно записать? Одну из ограниченного (это хорошо, что ограниченного) набора команд, а именно:

  • I. (insert) — включить;
  • D. (delete) — удалить;
  • U. (update) — обновить;
  • P. (print) — печатать.
  • Можно задавать константы, переменные и отношения.

    9.2.1 Запросы

    Приведем пример запроса QBE (таблица 9.2) эквивалентного следующему SQL-запросу:

    SELECT deptno FROM dept WHERE dname='SALES'
    

    Можно несколько расширить список команд, но мы сделаем это позже. Что еще можно добавить во второй и последующих строках?

    Простой запрос QBE
    dept deptno dname loc
    P. SALES
  • Константы, например, запись текстовой константы "SALES" в столбце dname на предыдущем рисунке означает условие "dname = 'SALES'".
  • Переменные. В отличие от констант в исходной версии QBE они обозначаются именами с подчеркиванием, например, SMITH или KING. В инструменте, с которым вы работаете, вместо подчеркивания имени его выделяют знаками подчеркивания перед именем и после него, например, _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_)

    9.3 Подъязык DML

    Подъязык DML как и в SQL представлен тремя командами —вставка (I.), удаление (D.) и обновление (U.). Пример вставки строки приведен в таблице 9.12.

    Вставка строки
    emp ename mgr sal deptno
    I. JONES 7638 43550 40

    Удалим из emp всех сотрудников отдела 40 (таблица 9.13)

    Удаление сотрудников отдела 40
    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.4 Создание таблицы

    Покажем на примере (таблица 9.16), как создается таблица с именем newtab и столбцами name, sal, mgr, dept. Начав с пустого шаблона, пользователь заполняет заголовки именами полей. Команда I. перед именем таблицы newtab означает "создать таблицу с именем newtab". Команда I. справа от newtab относится ко всей строке заголовков столбцов.

    Создание таблицы 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
    

    9.5 QBE в системах управления базами данных

    Из-за легкости усвоения QBE распространен довольно широко. Он используется в Microsoft Access, в СУБД Base OpenOffice, встроен во многие средства для разработки информационных систем, например, Hibernate. Существуют отдельные программы, предоставляющие язык QBE для широкого круга баз данных, использующих интерфейсы ODBC или JDBC.

    На (рисунке 9.4 вы найдете пример интерфейса QBE для Microsoft Access.

    (рис 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. Дело в том, что графические компоненты чрезвычайно удобны, но существенно ограничены. Слишком сложные образы только затрудняют восприятие.

    Страницы:

    Язык с очень странным названием Query-By-Example "Запрос по образцу" (QBE) основан на исчислении предикатов на доменах. Разработан он Мойше Злуфом в 1974-1975 гг. в фирме IBM. Как вы помните, основополагающая работа Кодда по реляционной алгебре появилась в 1970 году. Так что исчисление предикатов на доменах было реализовано в языке достаточно быстро.

    Странное слово в названии "по образцу" объясняется тем, в общем, случайным обстоятельствам, что, по мнению М. Злуфа, неквалифицированному пользователю удобнее выбирать в качестве имен переменных какое-нибудь значение этой переменной. Например, в уже известной вам таблице emp доменную переменную в столбце ename можно назвать SMITH или KING или еще каким-нибудь значением из домена ename.

    Заметим, что подчеркиванием в исходной версии QBE выделялись имена переменных. И еще одно чисто техническое замечание. Как вы помните, в SQL мы договорились обозначать служебные слова языка большими буквами, а имена таблиц и столбцов малыми. Здесь мы это правило будем нарушать потому, что в демонстрируемых реализациях для всех имен может использоваться верхний регистр. В основополагающих статьях М. Злуфа все имена изображаются большими буквами. В приводимых для сравнения записях инструкций SQL сохранены соглашения предыдущей лекции.

    9.1 Структура языка

    Язык QBE, как и другие языки баз данных, включает в себя два подъязыка:

  • ЯОД —средства определения структур данных и ограничений целостности;
  • ЯМД — средства манипулирования данными и средства для написания запросов к базам данных. Язык управления данными отсутствует.
  • Изобразительные средства QBE крайне лаконичны, что делает его доступным пользователям, не имеющим квалификации программиста. Причина в том, что QBE содержит неразрывно связанные две компоненты — графическую, представляющую шаблоны таблиц и блок условия, и вербальную, содержащую минимальный набор легко запоминаемых команд.

    Как всегда, все проверяем самостоятельно. С этой целью вам предоставляется специально разработанное инструментальное средство. В конце лекции приведен пример запроса QBE в Microsoft Access. Настоятельно рекомендую воспользоваться предоставляемыми на сайте книги www.database-model-lang-struct-semantic.ru материалами по Access и проработать в нем несколько примеров. Это даст вам правильное представление о возможностях реализации языка.

    9.2 Основы QBE

    Попадая в инструментальные средства, работающие в QBE, вы видите в старых (дографических) вариантах исходное изображение в виде пустого шаблона, в которое пользователь вводит имя таблицы (рисунок 9.1).

    (рис 9.1) Исходный шаблон из первой работы Злуфа

    В графическом интерфейсе предлагаемого вам инструментального средства появляется пустой прямоугольник (рисунок 9.2).

    (рис 9.2) Исходный шаблон

    Если таблица с указанным именем существует, появится полоса с двумя строками. В первой перечислены все столбцы таблицы, а вторая пустая. Пример шаблона для вызванной таблицы dept показан в таблице 9.1.

    Шаблон для таблицы dept
    dept deptno dname Loc

    Нижние строки, пока пустые, предназначены для ввода команд, переменных и операций отношения. Что в них можно записать? Одну из ограниченного (это хорошо, что ограниченного) набора команд, а именно:

  • I. (insert) — включить;
  • D. (delete) — удалить;
  • U. (update) — обновить;
  • P. (print) — печатать.
  • Можно задавать константы, переменные и отношения.

    9.2.1 Запросы

    Приведем пример запроса QBE (таблица 9.2) эквивалентного следующему SQL-запросу:

    SELECT deptno FROM dept WHERE dname='SALES'
    

    Можно несколько расширить список команд, но мы сделаем это позже. Что еще можно добавить во второй и последующих строках?

    Простой запрос QBE
    dept deptno dname loc
    P. SALES
  • Константы, например, запись текстовой константы "SALES" в столбце dname на предыдущем рисунке означает условие "dname = 'SALES'".
  • Переменные. В отличие от констант в исходной версии QBE они обозначаются именами с подчеркиванием, например, SMITH или KING. В инструменте, с которым вы работаете, вместо подчеркивания имени его выделяют знаками подчеркивания перед именем и после него, например, _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_)

    9.3 Подъязык DML

    Подъязык DML как и в SQL представлен тремя командами —вставка (I.), удаление (D.) и обновление (U.). Пример вставки строки приведен в таблице 9.12.

    Вставка строки
    emp ename mgr sal deptno
    I. JONES 7638 43550 40

    Удалим из emp всех сотрудников отдела 40 (таблица 9.13)

    Удаление сотрудников отдела 40
    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.4 Создание таблицы

    Покажем на примере (таблица 9.16), как создается таблица с именем newtab и столбцами name, sal, mgr, dept. Начав с пустого шаблона, пользователь заполняет заголовки именами полей. Команда I. перед именем таблицы newtab означает "создать таблицу с именем newtab". Команда I. справа от newtab относится ко всей строке заголовков столбцов.

    Создание таблицы 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
    

    9.5 QBE в системах управления базами данных

    Из-за легкости усвоения QBE распространен довольно широко. Он используется в Microsoft Access, в СУБД Base OpenOffice, встроен во многие средства для разработки информационных систем, например, Hibernate. Существуют отдельные программы, предоставляющие язык QBE для широкого круга баз данных, использующих интерфейсы ODBC или JDBC.

    На (рисунке 9.4 вы найдете пример интерфейса QBE для Microsoft Access.

    (рис 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. Дело в том, что графические компоненты чрезвычайно удобны, но существенно ограничены. Слишком сложные образы только затрудняют восприятие.

    Вернуться к учебному плану