Языки реляционных баз данных
В соответствии с принятым стилем изложения вы будете создавать примеры запросов в обоих исчислениях, используя уже известный вам инструмент WinRDBI. Материал лучше осваивается, если решать примеры. И когда вас просят потренироваться писать запросы на языках, которые не используются в промышленных СУБД, это не означает просьбу посетить кладбище погибших языков и отдать дань почившим. Многое из того, что вы при этом узнаете, переносится на действующие языки. Вы будете лучше понимать пути развития языков и подготовитесь к восприятию будущих нововведений.
Затем обратимся к лингвистике естественных языков для того, чтобы выяснить ограничения, которые они накладывают на восприятие мира носителями этих языков. Это позволит нам предположить наличие подобных или еще более сильных ограничений в искусственных языках и объяснить необходимость совместного использования нескольких таких языков.
Мы введем также общее представление о когнитивном направлении в науке и покажем, почему этот аспект важен для языков программирования вообще и языков баз данных в частности.
В конце лекции перечислим некоторые языки, используемые для создания информационных систем. Это позволит лучше понять роль и место реляционной модели и связанных с ней языков в общей проблематике баз данных и информационных систем.
7.1 Ограниченность языка реляционной алгебры
Возможности языка реляционной алгебры ограничены. Перечислим некоторые типы запросов, не выразимых средствами реляционной алгебры:
- запросы, требующие дать в ответе список отношений и/или атрибутов, удовлетворяющих определенным условиям (например, "в каких отношениях имеется атрибут sal?");
- запросы, требующие рекурсии.
Запросы первого типа требуют использования языков, основанных на логике предикатов второго порядка, у которых кванторы могут навешиваться не только на переменные, как у языков первого порядка, но и на имена предикатов.
Типичный пример запроса второго типа рассмотрен далее. Станет понятно, что для записи такого запроса язык должен использовать рекурсию.
Мы будем работать с таблицами учебной схемы Scott, заимствованной из Oracle. В ней таблица emp (сотрудники) содержит иерархическую структуру организации. empno — табельный номер, ename — имя сотрудника, job — должность, mgr — табельный номер непосредственного начальника, hiredate — дата приема на работу, sal — зарплата, comm — комиссионные, deptno — номер отдела (таблица 7.1).
* empno | ename | job | hiredate | sal | comm | mgr | deptno |
7369 | SMITH | CLERK | 17-12-1980 | 800 | 7902 | 20 | |
7499 | ALLEN | SALESMAN | 20-02-1981 | 1600 | 300 | 7698 | 30 |
7521 | WARD | SALESMAN | 22-02-1981 | 1250 | 500 | 7698 | 30 |
7566 | JONES | MANAGER | 02-04-1981 | 2975 | 7839 | 20 | |
7654 | MARTIN | SALESMAN | 28-09-1981 | 1250 | 1400 | 7698 | 30 |
7698 | BLAKE | MANAGER | 01-05-1981 | 2850 | 7839 | 30 | |
7782 | CLARK | MANAGER | 09-06-1981 | 2450 | 7839 | 10 | |
7788 | SCOTT | ANALYST | 09-12-1982 | 3000 | 7566 | 20 | |
7839 | KING | PRESIDENT | 17-11-1981 | 5000 | 10 | ||
7844 | TURNER | SALESMAN | 08-09-1981 | 1500 | 0 | 7698 | 30 |
7876 | ADAMS | CLERK | 12-01-1983 | 1100 | 7788 | 20 | |
7900 | JAMES | CLERK | 03-12-1981 | 950 | 7698 | 30 | |
7902 | FORD | ANALYST | 03-12-1981 | 3000 | 7566 | 20 | |
7934 | MILLER | CLERK | 23-01-1982 | 1300 | 7782 | 10 |
Отследим цепочку начальников Смита. Его непосредственный начальник имеет табельный номер 7902. Это аналитик Форд. Его начальник с табельным номером 7566 —менеджер Джонс, а у того начальник — президент Кинг с табельным номером 7839.
В таблице emp удалось записать иерархическую структуру организации, связывая строки через значения столбцов empno и mgr.
Для поиска непосредственных начальников каждого сотрудника достаточно написать простой запрос: proj E1.ENAME ПОДЧИНЁННЫЙ, E2.ENAME НАЧАЛЬНИК (join E1.MGR=E2.EMPNO (EMP E1, EMP E2)). Записи вида E1.ENAME ПОДЧИНЁННЫЙ, EMP E1 означает переименование E1.ENAME в ПОДЧИНЁННЫЙ, EMP в E1.
Найти всех начальников невозможно, так как для поиска каждого следующего начальника придется сделать еще одно соединение, а длина цепочки начальников различна для разных сотрудников и, вообще говоря, не может быть определена заранее.
Чтобы рекурсия была возможна, язык запросов должен был позволить повторение соединения каждого построенного отношения с исходным до тех пор, пока не найдется сотрудник, не имеющий начальника. Этого язык реляционной алгебры делать не позволяет. Однако в поздних версиях языка SQL, который мы будем изучать в следующей главе, рекурсивные запросы возможны.