Создание таблицы

Приведем пример запроса 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.