Создание таблицы
Приведем пример запроса QBE эквивалентного следующему 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".
Строк найдено: 1Запрос: SELECT el.deptno FROM dept el WHERE el.dname = 'SALES'deptno30Выведем имена сотрудников, работающих в отделе 20 и получающих больше 2900. Запрос выглядит так.
Запрос со сложным условием | ||||
Запрос | ||||
emp | ename | sal | mgr | deptno |
P. | >2900 | |||
Результат | ||||
Строк найдено: 3 Запрос: | ||||
SELECT el.ename FROM emp elWHERE e1.deptno=20 AND e1.sal>2900 | ||||
ename JONES SCOTT FORD |
Обратите внимание на то, что в SQL псевдонимы автоматически проставляются для всех таблиц, используемых в запросе. Это особенность инструмента, но не QBE.
Для упорядочения вывода по возрастанию используется команда "АО.", а для вывода по убыванию "DO.". Это аналоги слов Ascending и Descending из фразы ORDER BY в SQL.
Упоминавшееся при изучении исчисления на доменах условие принадлежности доменного значения кортежу обозначается пользователем за счет помещения значений столбцов в схему таблицы, что учитывает транслятор.
Основное назначение переменных — создание соединений таблиц. С этой целью под списком имен таблиц можно поместить две или более строк, заполненных командами и условиями. Соединение организуется по двум столбцам одной или разных таблиц, в которых проставлены переменные с одинаковыми именами. Рассмотрим пример.
Реализуем соединение таблицы emp с собой и с таблицей dept в запросе: "Найти имена и зарплаты служащих, получающих больше, чем JAMES, и работающих в отделе продаж (SALES)".
Запрос с соединением трех таблиц
Запрос с соединением трех таблиц | ||
Результат | ||
Строк найдено: 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 | |
Читаем первую строку команд и условий для 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.salFROM emp el, emp e2, dept e3WHERE e1.sal>e2.sal AND — соединения e1 и e2e1.deptno=e3.deptno AND — соединение e1 и e3e3.dname='SALES' AND — условие для e3e2.ename='JAMES' — условие для e2При необходимости распечатки отладочных данных достаточно проставить в нужной строке команды печати и прогнать на исполнение полученную версию.
В записи условия выбора можно работать с текстовыми шаблонами. Для этого часть литерала выделяют знаками подчеркивания в начале, середине или конце слова или предложения. В примере, приведенном ниже, запись A_LLEN_ в столбце ename означает, что ищутся значения, начинающиеся с "A", а _LLEN_ — это переменная с именем LLEN, включающая остальную часть слова. Шаблон _X_PA_Y_, означает слово или предложение, такие, что где-то в них содержатся последовательность букв "PA". Итак, наличие шаблона эквивалентно оператору LIKE в SQL. Это хорошо видно по следующему примеру в таблице
Запрос с текстовым шаблоном | |||
Запрос | |||
emp | ename | sal | deptno |
P.A_LLEN_ | |||
Результат | |||
Строк найдено: 2 Запрос: | |||
SELECT e1.ename,e1.deptno FROM emp el WHERE el.ename LIKE 'A%' | |||
ename ALLEN ADAMS | deptno |
Заметим, что переменные можно поместить в задании запроса в любых столбцах, как пустых, так и содержащих команды. В некоторых реализациях добавление переменной после команды P. обеспечивает вывод всех дублирующих значений, а переменные в столбцах без команды P. запрещают удаление соответствующих колонок в ответе.
Можно использовать отрицание запроса —. У нас отрицание обозначено "~". В следующем примере требуется вывести имена всех сотрудников, не работающих в отделе продаж. Этот же запрос можно переписать с отрицанием условия.
Отрицание запроса | |||
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 создают шаблон результата, записывая в него нужные имена и связывая его с исходной таблицей или с соединением исходных таблиц.
Порядок таблиц и в этом случае несущественен. Объединение условий связками И и ИЛИ осуществляется за счет манипулирования переменными. Пример на применение связки И. Вывести имена сотрудников отдела 30 с зарплатой больше 1500, но меньше 3500.
Связка И в запросе | ||||
Запрос | ||||
emp | ename | mgr | sal | deptno |
P._Name_ | P.>1500 | P. | ||
_Name_ | <3500 | |||
_Name_ | ||||
Результат | ||||
Строк найдено: 2 Запрос: | ||||
SELECT el.ename, el.sal, el.deptno FROM emp el, emp e2, emp e3WHERE 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 | deptno30 |
Обратите внимание на то, что при реализации логической связки И во всех трех строках использовано одно имя переменной _Name_ в одном и том же столбце. Отметим, что условие "=30" можно было перенести в первую строку сократив, тем самым, запрос. Использование разных переменных позволяет включить связку ИЛИ. В качестве примера, выведем имена сотрудников, зарплата которых составляет $10000, $13000 или $16000 .
Связка ИЛИ | ||
emp | name | sal |
P._JONES_ | ||
P._LEWIS_ | ||
P._HENRY_ |
В блоке условий составляющие условия объединяют знаками & (И) и |
(ИЛИ).
Для указания столбца, по которому производят группирование в исходном варианте QBE, его подчеркивают двойной чертой. В нашей программе для указания на группирование использована функция G.
В 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 такие запросы можно организовать, используя таблицы или представления словаря.
Дата добавления: 2015-01-29; просмотров: 1107;