Обсуждается высокоуровневый язык управления базами данных, предоставляющий пользователю удобный и унифицированный интерфейс для формирования запросов, обновления, определения и контроля базы данных.
При выполнении пользователем операции с базой данных, он строит пример ее решения в таблице-шаблоне, которая может быть ассоциирована с реальной таблицей в базе данных. В настоящее время система находится в экспериментальной эксплуатации в нескольких приложениях.
Query-by-Example [1-4] - высокоуровневый язык управления базами данных, предоставляющий удобный и унифицированный стиль для построения запросов, обновления, определения и контроля базы данных. Согласно философии Query-by-Example, от пользователя требуется весьма скромные знания для начала работы и сводится к минимуму количество концепций, которые он должен изучить для понимания и использования всего языка. Синтаксис языка прост, но тем не менее он охватывает широкий спектр сложных операций. Это достигается за счет использования одинаковых операций для извлечения, манипулирования, определения и контроля. Операции языка должны подражать, насколько возможно, ручному манипулированию таблицами, сохраняя тем самым простоту, симметричность и нейтральность реляционной модели [5,6]. Формирование операций должно следовать мыслительному процессу пользователя, предоставляя тем самым свободу при их построении. Система должна динамически создавать и уничтожать таблицы базы данных, она должна также предоставлять пользователю возможности динамического определения предложений контроля и средства безопасности.
Архитектура языка Query-by-Example направлена на удовлетворение только что сформулированных требований. Результаты различных психологических исследований показывают, что достаточно для инструктирования непрограммистов менее трех часов, после чего они могут формулировать довольно сложные запросы, которые в противном случае требуют от пользователя знания исчисления предикатов первого порядка. Другими непроцедурными языками в этой области являются SEQUEL [8] и QUEL[9].
Первая реализация Query-by-Example была выполнена K.E. Niebuhr и S.E. Smith [11]. В настоящее время язык экспериментально используется в различных приложениях, среди которых управление библиотечными файлами, ресурсами компьютеров, файлами патентов, почтовыми файлами и платежными счетами. Формальные синтаксис и семантика, полнота, спецификации авторизации и целостности приведены в работе [12].
В следующих разделах при помощи модельных примеров выборки, манипулирования и определения показываются возможности Query-by-Example.
Выборка
Часть языка, связанная с запросами, иллюстрируется примерами над следующими таблицами:
· EMP(NAME, SAL, MGR, DEPT),
· SALES(DEPT, ITEM),
· SUPPLY(ITEM, SUPPLIER),
· TYPE(ITEM, COLOR, SIZE),
где таблица EMP определяет имя, зарплату, руководителя и отдел каждого служащего, таблица SALES содержит список товаров, продаваемых каждым отделом, таблица SUPPLY хранит список товаров, поставляемых каждым поставщиком, и таблица TYPE описывает цвет и размер каждого товара.
В Query-by-Example фундаментальными являются две основные концепции. Программирование осуществляется посредством двумерных таблиц-шаблонов. Это достигается заполнением соответствующих полей таблицы в примере решения. Проводится также различие между постоянным элементом и элементом примера. Элементы примера (переменные) подчеркиваются, а постоянные элементы нет.
Используя две эти концепции, пользователь может сформулировать широкий спектр запросов. Рассмотрим, например, таблицу TYPE, которая содержит в качестве заголовков столбцов ITEM, COLOR и SIZE. Допустим, пользователь хочет сформулировать следующий запрос: "Вывести все зеленые товары". Изначально предлагается шаблон на экране, как показано на рис.1.
Шаблон таблицы.
Пользователь вводит имя таблицы, к которой будет осуществляться запрос, в поле имени таблицы: в данном случае имя таблицы - TYPE. Затем может либо ввести заголовки столбцов, либо позволить системе сделать это автоматически. (Эта операция объясняется далее.) После этого пользователь формулирует запрос, осуществляя ввод, показанный на рис. 2. Здесь P. означает <напечатать>, и показывает желаемый вывод. Конструкция ROD, являющаяся элементом примера (переменной), подчеркнута и представляет пример возможного ответа. GREEN (ЗЕЛЕНЫЙ) - это постоянный элемент, определяющий требуемое условие запроса. Эта конструкция не подчеркивается.
Заголовок столбцов и необходимый ввод для получения товаров зеленого цвета.
Запрос можно перефразировать следующим образом: напечатать все товары - такие как ROD, - цвет которых является зеленым. Элемент ROD необязательно должен содержаться в базе данных. Поскольку элемент примера является произвольным, пользователь может обозначить его как X, 10, 11 или WATER без изменения смысла и результатов запроса. Позднее мы рассмотрим элементы примера, используемые для установления связей между двумя или более строками одной таблицы или разными таблицами. Там, где не нужны связи, элементы примера можно опускать. Тем самым запрос может быть эквивалентно переформулирован, как показано на рис. 3. Таким образом, отдельная конструкция P. означает P."Элемент Примера". В следующих примерах мы используем P. или P."Элемент Примера" произвольным образом.
Возможная формулировка запроса для вывода зеленых деталей.
После того как запрос сформулирован, пользователь нажимает клавишу Enter для получения ответа. При использовании модельной базы данных, приведенной в приложении, вывод запроса будет иметь вид, показанный на рис. 4. Будет выведен только столбец товаров, поскольку на рис. 3 конструкция P. была введена только в столбец ITEM. Если бы эта конструкция была введена в столбец SIZE, система вывела бы и товары и их размеры.
Пример вывода на экран зеленых товаров.
Когда пользователь формулирует запрос (или любую другую операцию) в таблице-шаблоне, он воспринимает шаблон запроса как реальную таблицу с теми же заголовками, что и таблица запроса, и содержащую реальные данные. Другими словами, для выражения запроса он подражает операции ручного просмотра таблиц. Если для выражения запроса пользователю необходимы две или больше таблиц, он может сформировать дополнительные пустые шаблоны (используя специальные функциональные клавиши) и затем ввести информацию в их заголовки.
Рассмотрим несколько типов запросов на иллюстративных примерах.
Простая выборка. Вывести все цвета. Формулировка этого запроса показана на рис. 5. Конструкция WHITE может быть опущена. Дубликаты значений цветов в этом случае выводиться не будут. (Метод вывода дубликатов приведен далее в этой статье.) В случае автоматического предоставления системой заголовков столбцов, пользователь может (если это желательно) удалить неиспользуемые столбцы. Таким образом, столбцы ITEM и SIZE могли бы быть удалены.
Простая выборка.
Простая выборка с упорядочиванием. Вывести все цвета в алфавитном порядке. Как показано на рис. 6, конструкция "AO." используется для вывода по возрастанию. Аналогично, конструкция "DO." используется для вывода по убыванию. Там, где необходимы первичная и вторичная сортировки, "AO(1)." применяется для первичной и "AO(2)." - для вторичной сортировки, соответственно.
Простая выборка с упорядочиванием.
Простая выборка с множественным выводом. Напечатать всю таблицу TYPE. Эта операция показана на рис. 7. Здесь также могут быть использованы элементы примера. Сокращенное представление этого запроса приведено на рис. 8. Здесь оператор вывода P. применяется ко всей строке. Заметим, что все системные операторы, такие как P., I. и AO., заканчиваются точкой. Если таблица содержит множество столбцов, пользователь может вывести все необходимые, удалив предварительно ненужные столбцы и применив оператор P. для всей строки, представляющей только оставшиеся столбцы.
Простая выборка с множественным выводом.
Сокращенная простая выборка с множественным выводом.
Выборка имен таблиц. Вывести список имен доступных таблиц базы данных. Формулировка этого запроса приведена на рис. 9. Здесь оператор вывода расположен в поле имени таблицы, запрашивая тем самым у системы все доступные имена таблиц. Для нашей модельной базы данных результатом этого запроса будет :
EMP SALES SUPPLY TYPE
Выборка имен таблиц.
И снова элемент примера TAB является необязательным.
Выборка заголовков столбцов. Ранее было сказано, что вместо ввода заголовков столбцов пользователем система может сгенерировать их автоматически. Как это делается, показано на рис. 10. В этом примере запрашиваются заголовки столбцов таблицы TYPE. Здесь опять оператор вывода применен ко всей строке заголовков, и в действительности, этот пример является сокращенной формой расположения нескольких операторов вывода в полях заголовков столбцов. Автоматическое порождение заголовков столбцов полезно, поскольку оно освобождает пользователя от необходимости запоминания этих заголовков (или нахождения их в каталоге), предотвращая тем самым ошибки при вводе.
Выборка заголовков столбцов.
Если пользователь введет "P. TAB P." (или "P. P.") в поле имени таблицы, система выведет каталог базы данных, т. е. имена таблиц и имена соответствующих этим таблицам столбцов.
Выборка с квалификаторами. Вывести имена сотрудников, работающих в отделе игр (TOY) и получающих больше $10000. Этот запрос показан на рис. 11. Обратите внимание на формулировку условия "больше $10000". Здесь возможно использование любого из следующих операторов сравнения: <>, >, >=, <, <=. Если не один из операторов сравнения не используется, подразумевается оператор равенства. Символ <> может быть заменен символами -| или -|=.
.Выборка с квалификаторами.
Выборка с квалификаторами и частичным подчеркиванием. Вывести товары зеленого цвета, начинающиеся с буквы I. Пример приведен на рис. 12. Символ I в конструкции "IKE" не подчеркнут и является константой. Следовательно, система выведет все зеленые товары, начинающиеся с буквы I. Пользователь может применять частичное подчеркивание в начале, середине или конце слова, предложения или параграфа, как в примере XPAY, означающем слово, предложение или параграф, такие, что где-то в них содержатся буквы PA. Поскольку элементы примера могут быть пустыми, слова, предложения и параграфы, начинающиеся или заканчивающиеся буквами PA, также удовлетворяют этому условию.
Выборка с квалификаторами и частичным подчеркиванием.
Возможность частичного подчеркивания полезна в том случае, когда хранимой информацией является предложение или текст, и пользователю необходимо найти все примеры, содержащие определенное слово или корень. Если, например, необходимо найти все элементы со словом Texas, формулировкой запроса будет XTEXASY.
Выборка с квалификаторами и использованием связей. Вывести все зеленые товары, продаваемые отделом игр. Пример приведен на рис. 13. В этом случае пользователь использует и таблицу TYPE, и таблицу SALES, порождая два пустых шаблона и заполняя их заголовками и необходимыми элементами запроса. В этом примере проиллюстрирована важность элементов примера. Здесь должен быть применен один и тот же элемент примера в обеих таблицах, показывая, что если товар из примера, такой как NUT, зеленого цвета, то тот же товар продается отделом игр. Только если выполняются оба условия, товар представляет собой решение. Эквивалентом при ручной обработке была бы следующая процедура: просмотр таблицы TYPE и нахождение товаров зеленого цвета, с последующим просмотром таблицы SALES для определения того, продается ли данный товар отделом игр. Поскольку в формулировке запроса нет никаких указаний на то, как должен обрабатываться запрос и в каком порядке должен осуществляться просмотр таблиц, она является нейтральной и симметричной.
Выборка с квалификаторами и использованием связей.
Элементы примера, связанные в одной таблице. Вывести имена и зарплаты сотрудников, получающих больше, чем Lewis. Пример показан на рис. 14. Lewis получает S1, осталось найти имена сотрудников, получающих больше, чем S1. Порядок строк в примере несущественен: пользователь не обязан каким-либо образом структурировать запрос. Вместо этого существует возможность формулировать запрос в соответствии с тем, как пользователь его обдумывает.
Элементы примера, связанные в одной таблице.
Другим средством Query-by-Example является возможность формирования сложных запросов путем расширения существующих простых запросов. Такое расширение предыдущего примера, состоящее в добавлении дополнительного условия, приведено на рис. 15. Формулировка этого запроса состоит в следующем: найти имена и зарплаты служащих, получающих больше, чем Lewis, и работающих в отделе, продающем ручки.
Расширение примера из рис. 14.
Две связи в одной и той же таблицы.
Следующий запрос: найти имена служащих, получающих больше, чем их руководители. Его можно переформулировать следующим образом: вывести все имена служащих, чьим руководителем является JONES (например), и кто получает больше, чем S1 (например), где S1 - зарплата JONES. Здесь один и тот же элемент примера используется для связи руководителя в первой строке и имени во второй строке, а другой элемент примера применяется для сравнения зарплат. Порядок строк, естественно, вновь несущественен. После получения ответа пользователь имеет возможность вернуться назад и модифицировать или исправить старый запрос. Если, например, пользователь не уверен, что последний запрос верен, т.е. что запрос был правильно сформулирован, он может снабдить каждый элемент операторами вывода, получив при этом имена служащих, их зарплаты и имена их руководителей в первой строке и те же имена руководителей и их зарплаты во второй строке. Таким способом пользователь может проверить точность выполнения запроса.
Выборка с использованием отрицания. Вывести все отделы, продающие товар, не поставляемый Pencraft Company. Этот запрос показан на рис. 17. Здесь использован оператор отрицания (-|) для всего выражения запроса в таблице SUPPLY. Этот запрос может быть перефразирован так: вывести названия отделов, продающих товары INK, такие, что PENCRAFT не поставляет товары INK. Другими словами, система просматривает пары (INK, PENCRAFT) по всей таблице, и название соответствующего отдела выводится только в том случае, если такой пары не находится. Этот запрос отличается от следующего.
Выборка с использованием отрицания.
Выборка с использованием отрицания. Вывести все отделы, продающие товары, поставляемые поставщиком, отличающимся от Pencraft Company. Этот запрос проиллюстрирован на рис. 18. В этом примере система извлекает данные таблицы SUPPLY для поставщиков, отличающихся от Pencraft, и затем выбирает соответствующие отделы. Обратите внимание, что пара (INK, PENCRAFT) также может существовать.
Выборка с использованием отрицания.
Выборка объединенной информации из нескольких таблиц. Вывести все отделы с их поставщиками. Поскольку результатом вывода является новая таблица, пользователь должен сформировать шаблон третьей таблицы и заполнить его примерами из двух существующих таблиц, удовлетворяющими условиям запроса. Так как эта таблица создается пользователем - и, следовательно, не содержит хранимых данных, - он может заполнить поля заголовков столбцов или оставить их пустыми. Пример показан на рис.19.
Выборка объединенной информации из нескольких таблиц.
Использование ZZZ, THING и XXX в качестве заголовков иллюстрирует тот факт, что пользователь может выбирать свои собственные заголовки. В результирующую таблицу из двух других таблиц передаются только элементы связи TOY и IBM. Наличие элемента INK в обеих таблицах SALES и SUPPLY означает, что TOY - это отдел, в который поставщик IBM поставляет товар INK. Порядок таблиц несущественен, т.е. результирующая таблица необязательно должна выводиться первой.
Если пользователь не формирует третьей таблицы, а снабжает префиксом P. элементы TOY и IBM в двух исходных таблицах, результатом будут две отдельные таблицы, одна из которых содержит отделы, а другая - поставщиков. При этом связь между отделами и их поставщиками будет утеряна.
Рассмотрим следующую таблицу: EMP1(NAME, SAL, COMMISSION).
Арифметические операции. Для каждого сотрудника вывести его имя и зарплату плюс комиссионные. Здесь пользователь вновь создает результирующую таблицу и выполняет искомую арифметическую операцию в ней, как показано на рис. 20. В этом случае пользователь создает таблицу OUTPUT и определяет заголовок EARNING. Арифметическое выражение (S1 + S2) суммирует зарплату и комиссионные каждого сотрудника. Любое арифметическое выражение допустимо для ввода в таблицу.
Арифметические операции.
Выборка с использованием блока условий. В Query-by-Example существует два двухмерных объекта. Один из них - уже описанный шаблон таблицы. Другой - это блок условий, представляющий собой блок с заголовком CONDITIONS. Пустой блок условий может быть выведен по желанию пользователя в любое время. Блок условий используется для формулирования одного или нескольких условий, которые трудно выразить в таблице.
Вывести имена сотрудников, зарплата которых больше, чем сумма зарплат сотрудников Jones и Nelson. Этот запрос приведен на рис. 21. Естественно, это простое условие могло быть выражено заменой S1 на ">(S2+S3)" в первой строке таблицы EMP.
Использование блока условий.
Знак равенства в блоке условий является условием равенства, и его не нужно путать с оператором присваивания. Операторы присваивания подразумевают процедуры, а Query-by-Example - язык непроцедурный. Тем самым операторы присваивания недопустимы. Выражение "W=M+N", например, может быть сформулировано как "M+N=W" или "M=W-N". Выражение "M=M+1" всегда является ложным. Различные условия в блоке условий вводятся на разных строках, но должны обрабатываться одновременно, т.е. над результатами разных условий выполняется операция логического И.
Выборка с использованием AND и OR. В Query-by-Example операции AND и OR выражаются неявно. В большинстве приведенных примеров мы производили операцию AND над результатами условий, либо размещая более двух элементов на строке (выборка с квалификаторами), либо связывая две строки с помощью элемента примера (выборка с квалификаторами и использованием связей). Запросы, приведенные на рис. 22 и 23, демонстрируют неявное использование операций AND и OR. Запросы, показанные на рис. 24 и 25, являются переформулированными запросами с рис. 22 и 23, и используют блок условий.
Неявная операция AND.
Вывести имена сотрудников, чья зарплата составляет от $10000 до $15000 и не равна $13000. Этот запрос показан на рис. 22. Применение элемента примера JONES во всех трех строках приводит к тому, что для сотрудника JONES выполняется операция AND над результатами этих трех условий.
Вывести имена сотрудников, зарплата которых составляет $10000, $13000 или $16000. Этот запрос проиллюстрирован на рис. 23. В различных строках используются разные элементы примера, поэтому эти три строчки выражают независимые запросы. Результатом является объединение трех множеств ответов. (В этом примере достаточно было применение просто оператора P. без указания элемента примера.)
Рисунок 23.
Неявная операция OR.
Формулировка операций AND и OR с использованием блока условий. Рис. 24 иллюстрирует применение операции AND с использованием блока условий. Рис. 25 показывает применение операции OR. Амперсенд & используется для представления операции AND, и символ | представляет операцию OR.
Рисунок 24.
Применение операции AND с использованием блока условий.
Рисунок 25.
Применение операции OR с использованием блока условий.
Пользователь может также указать операции AND и OR в упорядоченных парах элементов, как показано в следующем примере. Вывести имена сотрудников, чья зарплата и отдел являются либо парой ($10000, Toy), либо парой ($20000, Hardware). Зарплаты и отделы являются упорядоченными парами, и над ними может производиться операция OR, как показано на рис.26.
Рисунок 26.
Операция OR над упорядоченными парами.
Обратите внимание, что с использованием концепций элемента примера, постоянного элемента, оператора вывода и применением этих конструкций в шаблонах таблиц и блоках условий, пользователь может формулировать весьма сложные запросы. Они охватывают широкий спектр операций над реляционными базами данных, таких как проекции, выборки, соединения, проекции соединений, объединения, разность, пересечение и арифметические операции.
Выборка с использованием встроенных функций и оператора ALL. В языке Query-by-Example существуют шесть следующих встроенных фунций: CNT. (счетчик), SUM., AVG. (среднее), MIN. (минимум), MAX. (максимум) и UN. (уникальный). Функция UN. может быть присоединена к функциям CNT., SUM. или AVG.. Таким образом, CNT. UN. означает, что необходимо произвести подсчет только различающихся значений. Следующие примеры иллюстрируют применение этих функций.
Подсчитать общее количество сотрудников. Этот запрос показан на рис. 27. Выражение ALL.JONES представляет собой мультимножество (множество, содержащее дубликаты) всех имен в таблице EMP, и функция CNT. осуществляет подсчет числа элементов этого множества. Здесь также можно использовать конструкцию P.CNT.ALL., опустив элемент примера JONES.
Рисунок 27.
Использование функции CNT.
Подсчитать общее количество отделов в таблице SALES. Этот запрос проиллюстрирован на рис. 28. Поскольку в столбце DEPT существуют дубликаты отделов (столбец DEPT не является ключем), для удаления дубликатов используется функция UN.. Функция ALL. не удаляет дубликаты автоматически, так как она порождает мультимножество. Обратите внимание, что в случае использования конструкции P.ALL.TOY будет получен список всех отделов с их дубликатами.
Рисунок 28.
Использование функций CNT и UN.
Выборка с квалификаторами и использованием встроенных функций. Вывести сумму зарплат в отделе игр. Этот пример приведен на рис.29. Конструкция ALL.S1 порождает мультимножество всех зарплат, соответствующих отделу игр, т.е. мультимножество всех зарплат отдела игр. Таким образом, если зарплата всех пятидесяти сотрудников составляет $12000, при суммировании эта сумма будет учтена пятьдесят раз.
Рисунок 29.
Выборка с квалификаторами и использование встроенных функций.
Выборка с группированием. Для каждого отдела вывести его название и сумму зарплат всех сотрудников. Этот запрос показан на рис. 30. Группирование выполняется при помощи двойного подчеркивания TOY для явного указания оператора group-by. Этот запрос может быть перефразирован следующим образом: для каждого отдела TOY (например) просуммировать зарплаты всех его сотрудников.
Рисунок 30.
Выборка с группированием.
Вывести отделы, в которых работает более трех сотрудников. Этот пример приведен на рис. 31. Встроенные функции применимы только ко множествам, поэтому необходимо использование оператора ALL. или выражение-множество, заключенное в скобки. По этой причине конструкция CNT.INK вызовет сообщение об ошибке.
Рисунок 31.
Условие на множество товаров.
Выборка, включающая "связи множеств" и использующая оператор ALL. Вывести названия отделов, продающих по крайней мере все товары зеленого цвета. Пример показан на рис. 32. Выражение ALL.INK в таблице TYPE представляет собой мультимножество (т.е. множество, содержащее дубликаты) всех зеленых товаров. Тем самым, ALL.INK - это мультимножество всех товаров зеленого цвета. Строки таблицы SALES означают, что производится поиск отделов (таких как TOY), продающих это множество товаров и, может быть, что-нибудь еще. Звездочка означает, что могут существовать дополнительные товары, не входящие в это множество.
Рисунок 32.
Выборка, включающая "связи множеств".
Вывести названия отделов, таких, что все продаваемые ими товары являются зеленого цвета. Запрос приведен на рис. 33. В этом примере конструкция ALL.INK таблицы SALES представляет собой мультимножество всех товаров, продаваемых отделом TOY. Звездочка в таблице TYPE означает, что, несмотря на то, что товары ALL.INK должны быть зеленого цвета, могут существовать другие товары зеленого цвета.
Рисунок 33.
Выборка, включающая "связи множеств".
Вывести названия отделов, продающих все товары зеленого цвета и ничего больше. Пример показан на рис. 34. Здесь множества в обеих таблицах совпадают. Это означает, что не существует дополнительных товаров, не являющихся зелеными, и не существует других товаров зеленого цвета, продаваемых другими отделами.
Рисунок 34.
Выборка, включающая "связи множеств".
Вывести названия отделов, продающих все те товары, что и отдел аппаратуры и, может быть, что-то еще. Исключить отдел аппаратуры из этого списка. Пример приведен на рис. 35.
Рисунок 35.
Выборка, включающая "связи множеств" и использующая блок условий.
Несмотря на то что простая связь может быть выражена использованием одного элемента примера в двух или более строках, в связи множеств необходимо различать эквивалентность множеств и включаемость множеств друг в друга. Первое достигается указанием идентичных связей множеств, как показано на рис. 34, второе - использованием звездочки.
Обобщенное скобочное выражение может содержать одно или более множеств, а также произвольное количество единичных элементов примера и постоянных элементов. В него также может входить или не входить единичная звездочка. Например, следующее скобочное выражение является правильным:
[ALL.INK ALL.PEN PENCIL DISH]
В то время как выражение:
[PENCIL DISH *]
не является правильным, поскольку оно не содержит множеств.
Вставки, удаления, модификации
Вставки (I.), удаления (D.), модификации (U.) выполняются в том же стиле, что и операции выборки. Основное различие заключается в использовании операторов I., D. и U. вместо P., который употребляется в операциях выборки. Этот раздел состоит из двух основных частей: описание простых вставок, удалений и модификаций и описание операций, зависящих от выборки. Термин "простая" относится к операции, содержащей только постоянные элементы.
Простая вставка. Вставить в таблицу служащих нового сотрудника отдела игрушек; имя сотрудника - Jones, зарплата - $10000, имя руководителя - Henry. Выполнение этой операции показано на рис. 36. Так же, как операция P. применяется к целой строке, так и I. относится ко всей строке. Пустой ввод в поле при выполнении вставки интерпретируется как null-значение; при этом не допускается ввод null-значений в ключевые поля, в нашем примере на рис. 36 это поле NAME. Такое ограничение согласуется с реляционной моделью [5, 6] в том отношении, что поле первичного ключа должно однозначно определять запись (кортеж). (Спецификация первичного ключа показана ниже на рис. 45.)
Рисунок 36.
Простая вставка.
Простое удаление. Удалить информацию обо всех сотрудниках отдела игрушек. Пример такой операции показан на рис. 37. В этом случае удаляются все записи, которые содержат значение TOY в поле DEPT. Разумеется, допускается заполнение полей NAME, SAL, MGR элементами примера.
Рисунок 37.
Простое удаление.
Простая модификация. Установить новое значение зарплаты Henry - $50000. Формулировка этой операции приведена на рис. 38. Query-by-Example не позволяет изменять поле первичного ключа. В примере на рис. 38 новое значение зарплаты Henry устанавливается независимо от прежнего значения этого поля. Поле (поля) первичного ключа должны обязательно задаваться для обеспечения уникальности. Пустое поле означает, что его модифицировать не нужно. Если требуется изменить содержимое поля на null-значение, то следует ввести в него слово NULL или специальный определяемый пользователем символ; способ определения такого символа описан ниже.
Рисунок 38.
Простая модификация.
Вставка, зависящая от выборки. Вставить в таблицу служащих нового сотрудника отдела игрушек, чье имя - Henry, имя руководителя - Lee, а зарплата такая же, как у сотрудника с именем Lewis. Формулировка этой операции представлена на рис. 39. Это пример вставки, зависящей от выборки, поскольку система должна сначала произвести в базе данных выборку зарплаты Lewis, а затем скопировать полученное значение в соответствующее поле записи о сотруднике Henry. Хотя последовательность строк при формулировании операции несущественна, в ней присутствует неявное упорядочение выполнения - вставку нельзя завершить до выполнения выборки.
Рисунок 39.
Вставка, зависящая от выборки.
Удаление, зависящее от выборки. Удалить всех сотудников, работающих в отделе продажи ручек. Способ выполнения этой операции показан на рис. 40. Заполнять поля NAME, SAL, MGR элементами примера здесь не обязательно.
Рисунок 40.
Удаление, зависящее от выборки.
Модификации, зависящие от выборки. Часто желательно бывает установить новое значение некоторого поля, зависящее от исходного. Подобные зависимости задаются неявно. Пример: повысить зарплаты служащих отдела игрушек на 10 процентов. Выполнение этой операции изображено на рис. 41. Выражение в поле SAL в строке, которая содержит символ операции U., - это новое значение зарплаты; во второй строке задана операция выборки прежнего значения. Операцию можно переформулировать следующим образом: выбрать запись со значением TOY в поле DEPT, найти значение поля зарплаты S1 и изменить его на новое, равное 1,1*S1.
Рисунок 41.
Модификации, зависящие от выборки.
Поскольку результат выборки из таблицы, или отношения, также является таблицей, то пользователь может оперировать непосредственно с такой таблицей. Например, получив результат выборки всех служащих отдела игрушек, он может удалить любую запись, поставив напротив нее символ операции D. и нажав клавишу ВВОД.
Создание таблицы
Создание таблицы в языке Query-by-Example выполняется в том же стиле, что и описанные ранее операции. Таблица определяется при помощи шаблона с постоянными элементами и элементами примера. Пользователю предоставляются средства для создания новых таблиц и расширения существующих, для определения снимков (snapshot), представляющих собой выборки данных из нескольких таблиц, выполненные в определенные моменты времени, или представлений (view) данных, динамически выбираемых из множества таблиц. Все эти операции выполняются неявно, без использования специальных ключевых слов, как это было в более ранних версиях языка [2].
Создание новой таблицы. На рис. 42 продемонстрировано создание таблицы с именем EMP и столбцами NAME, SAL, MGR, DEPT. Начав с пустого шаблона (как при формулировании выборки), пользователь заполняет заголовки именами полей. Оператор I. справа от EMP относится ко всей строке заголовков столбцов.
Рисунок 42.
Создание заголовков столбцов новой таблицы.
Для описания типов данных, размеров, доменов, признаков ключевого (неключевого) поля используются атрибуты строк (ключевые слова). Для упрощения работы пользователя эти атрибуты вставлены во все шаблоны, и пользователю не нужно вставлять их самому. Например, он может запросить имена атрибутов, как это показано на рис. 43. Данная операция создает новую таблицу и затем выполняет вывод всех атрибутов строк в системе. Результат этого оператора показан на рис. 44. Пользователь затем определяет атрибуты таблицы, заполняя строки шаблона, как показано на рис. 45. Поскольку атрибуты строк уже вставлены в таблицу, вводить оператор I. справа от них необязательно. Никакого вреда, однако, не будет, если ввести тем не менее этот оператор.
Рисунок 43.
Выборка строки имен атрибутов.
Рисунок 44.
Показ имен атрибутов строк.
Рисунок 45.
Определения атрибутов.
Ниже приведены описания атрибутов строк для таблиц.
· TYPE задает тип элемента данных, например CHAR, FLOAT, FIXED и т.д.
· LENGTH задает ширину поля. (По умолчанию ширина равна длине заголовка столбца.)
· KEY используется для указания полей, которые будут рассматриваться как поля первичного ключа. (K означает Key - ключ, NK означает NonKey - не ключ.) Как уже говорилось, ключевые поля не могут содержать null-значения, а также дублирующиеся значения. Для полей, специфицированных как ключевые, гарантируется поддержка этих ограничений. Система также не позволяет изменять значения этих полей.
· DOMAIN задает имя домена, т.е. множества значений, которому должны принадлежать элементы данных в поле. Например, данные столбцов NAME и MGR берутся из домена NAMES. Спецификация атрибута DOMAIN полезна в тех случаях, когда нужно знать, какие столбцы принадлежат к одному и тому же домену. Это не всегда можно определить по именам столбцов. Например, столбцы NAME и MGR в таблице EMP принадлежат одному домену, следовательно, элементы NAME и MGR могут быть связаны.
· SYSNULL (System Null) задает необязательный символ, обозначающий системное null-значение. В данном примере используется символ -.
Описав все или часть значений из примера на рис. 45, пользователь может в том же самом шаблоне ввести данные. Вставив данные, можно формулировать запросы, относящиеся как к каталогу определения данных, так и к самим данным.
Расширение таблицы. Владелец таблицы может расширить ее определение, действуя примерно так же, как при создании новой таблицы. Например, он может добавить к таблице EMP столбец COMMISION. Сначала пользователь должен запросить для таблицы EMP имена атрибутов строк (рис. 46). Результатом этого запроса будет полный каталог таблицы, как он был определен ранее. Пользователь должен вставить имя нового столбца и ввести для него значения атрибутов, как показано на рис. 47. Если в таблице есть данные, то уже существующие строки будут содержать в поле COMMISSION null-значения, пока пользователь не переопределит их.
Рисунок 46.
Выборка атрибутов строк.
Рисунок 47.
Определение нового столбца в таблице.
Модификация каталога таблицы. Оператор U. изменяет каталог таблицы - будь то заголовки или атрибуты - подобно тому, как при помощи оператора I. осуществляется вставка. Например, если нужно изменить имя таблицы с EMP на EMP1, то достаточно ввести перед именем таблицы оператор U. и напечатать новое имя вместо старого. При нажатии клавиши ВВОД имя таблицы будет изменено.
Удаление информации из каталога таблицы и уничтожение таблицы. При помощи оператора D. можно уничтожать элементы каталога точно так же, как обычные данные. Например, задав оператор D. в записи, содержащей описания ключевых/неключевых полей, вы уничтожите соответствующие спецификации.
Для того, чтобы уничтожить столбец таблицы, достаточно указать перед его именем оператор D. Фактически такой оператор - это сокращенный способ выполнить и удаление всех данных столбца, и имени столбца. Аналогично, указание оператора D. перед именем таблицы - это быстрый способ для уничтожения соответствующих элементов данных, информации каталога, заголовков столбцов и имени таблицы.
Создание снимка. Выше мы показали, как можно получить новую таблицу, состоящую из данных других таблиц. Эта таблица была выведена на экран, но не сохранена в системе. Пользователь может сохранить новую таблицу, определив ее заголовок (как при создании новой таблицы).
Выполним вновь пример, показанный на рис. 19, но сохраним результирующую таблицу под именем SS, определив заголовки ее столбцов: DEPT и SUPPLIER. Эти действия продемонстрированы на рис. 48. Таблица SS представляет собой снимок данных, хранившихся в исходных таблицах в момент его создания. Поскольку теперь это новая таблица в нашей базе данных, то по отношению к ней можно выполнять операции вставки, удаления, модификации.
Рисунок 48.
Создание снимка.
Создание представления. Часто возникает потребность создать одну таблицу на основе нескольких других, в которой бы динамически отражались изменения данных из исходных таблиц. Такая таблица называется представлением; в представлении отображаются все изменения, производимые в таблицах, из которых оно получено. Для того чтобы создать представление, необходимо указать перед именем таблицы ключевое слово VIEW, чтобы отличить его от снимка.
Повторим предыдущий пример, но создадим не снимок, а представление с именем ST, как показано на рис. 49. Данные представления физически не хранятся в базе данных. В системе хранятся лишь указатели его на исходные составные части, а данные материализуются лишь тогда, когда пользователь запрашивает вывод из этого представления.
Рисунок 49.
Создание представления.
Заключение
В статье приведен обзор средств языка Query-by-Example для выполнения выборки, манипулирования и определения данных. Уникальное свойство языка заключается в том, что для его первоначального освоения и использования достаточно освоить лишь минимальное число основных понятий.
В противоположность англоподобным языкам, где пользователь должен придерживаться определенной структуры предложений, в среде Query-by-Example можно ввести в качестве элемента шаблона любое выражение, если только оно синтаксически корректно. Иначе говоря, поскольку элементы привязаны к шаблонам таблиц, то пользователь имеет возможность вводить лишь допустимые запросы. В языке запросов англоподобной структуры всегда есть опасность ввести запрос, не удовлетворяющий синтаксическим правилам.
Поскольку порядок заполнения таблиц неважен, то при формулировании операции предоставляется множество степеней свободы.
Мы показали, как пользователь может строить запрос, постепенно доопределяя новые условия; таким образом, можно постепенно переходить от простых запросов к более сложным.
Операции выборки, манипулирования, определения данных выполняются единообразно, с минимальными различиями в синтаксических правилах.
Приложение
Ниже приведено содержимое таблиц, которые использовались в данной статье в качестве примеров.
Благодарности
Автор выражает признательность S.P. deJong и K.K. Nieburh за их полезные предложения в процессе разработки Query-by-Example. Автор также благодарен S.E. Smith, R.R. Jones и R.J. Byrd за полезные обсуждения.
Литература
1. M.M. Zloof, "Query by Example", AFIPS Conference Proceedings, National Computer Conference 44, 431-438 (1975).
2. M.M. Zloof, "Query by Example. The Invocation and Definition of Tables and Forms", Proceedings of The International Conference on Very Large Data Bases, Boston, Massachusetts, September 22-24, 1975, pp. 1-24.
3. M.M. Zloof, "Query-by-Example: Operations on the Transitive Closure", Research Report RC 5526, IBM Thomas J. Watson Research Center, Yorktown Heights, New York, 1975.
4. M.M. Zloof, "Query-by-Example: Operation on Hierarchical Data Bases", AFIPS Conference Proceedings, National Computer Conference 45, 845-853 (1976).
5. E.F. Codd, "A Relational Model of Data for Large Shared Data Banks", Communications of the ACM 13, No.6, 377-387 (1970).
6. E.F. Codd, "Further Normalization of the Data Base Relational Model", Courant Computer Science Symposia Vol.6, Data Base Systems, Prentice-Hall, Inc., New York, NY (1971).
7. J.C. Thomas and J.D. Gould, "A Psychological Study of Query by Example", Proceedings of the National Computer Conference 44, 439-445 (1975).
8. D.D. Chamberlin et al., "SEQUEL 2: A Unified Approach to Data Definition, Manipulation and Control", IBM Journal of Research and Development 20, 560-575 (1976).
9. G.D. Held, M.R. Stonebraker, and E. Wang, "INGRES: A Relational Data Base System", Proceedings of the National Computer Conference 44, (1975).
10. C.J. Date, An Introduction to Data Base Systems, Addison-Wesley Publishing Co., Inc., Reading, MA (second edition , 1977).
11. K.E. Niebuhr, and S.E. Smith, "Implementation of Query-by-Example on VM/370", Research Report, IBM Thomas J. Watson Research Center, Yorktown Heights, New York, in preparation.
12. M.M. Zloof, "Query-by-Example: A Data Base Management Language", IBM Research Report available upon request from the author, IBM Thomas J. Watson Research Center, Yorktown Heights, New York.
13. M.M. Zloof and S.P. deJong, "The system for business automation (SBA): Programming Language", Communications of the ACM 20, No.6, 385-396.
14. S.P. deJong and M.M. Zloof, "Application design within the system for business automation (SBA)", Proceedings of the Twelfth Design Automation Conference, Boston, Massachusetts, June, 1975, pp.69-76.
Переведено из IBM Systems Journal, Vol.16, # 4, 1977 с разрешения фирмы IBM.
(c) IBM Corporation.