Многотабличные запросы
Возможность связывать элементы данных вне границ одной таблицы важна для любого языка баз данных. SQL связывает данные разных таблиц аналогично тому, как это делает операция соединения реляционной алгебры. Рассмотрим запрос.
Запрос: Вывести специальности рабочих, назначенных на здание 435.
Данные, необходимые для ответа, находятся в двух таблицах: «Работник» и «Работа». Для решения в SQL требуется перечислить обе таблицы в команде FROM и задать специальный тип условия WHERE:
SELECT Специальность
FROM Работник, Работа
WHERE Работник. № работника = Работа. № работника
AND № здания = 435
Рассмотрим два этапа обработки системой данного запроса.
1. Сначала обрабатывается фраза FROM. Однако в этом случае, поскольку в команде указаны две таблицы, система создает декартово произведение строк этих таблиц. Если в команде FROM перечислено более двух таблиц, то создается декартово произведение всех таблиц, указанных в команде.
2. После создания гигантской реляционной таблицы система применяет команду WHERE. Каждая строка таблицы, созданной командой FROM, проверяется на выполнение условия WHERE. Строки, не удовлетворяющие условию, исключаются из рассмотрения. Затем к оставшимся строкам применяется фраза SELECT.
Фраза WHERE в данном запросе содержит два условия:
1. WHERE Работник. № работника = Работа. № работника
2. № здания = 435
Первое из этих условий – условие соединения. Так как обе таблицы содержат столбец с именем «№ работника», их декартово произведение будет содержать два столбца с таким именем. Для того чтобы различить их, помещаем перед именем столбца имя исходной таблицы, отделяя его точкой.
Полное соединение этих двух таблиц представлено на рис. 7.2.
№ рабо- Фамилия Недельная Специальность
тника зарплата 1412 К. Иванов 13.75 штукатур 1235 И. Петров 12.50 электрик Работа
№ работника № здания Дата_начала Число_дней
1412 435 15.10 15 1235 435 17.10 22 |
Рис. 5.2. Соединение таблиц «Работник» и «Работа»
Результат:
штукатур
электрик
В SQL можно за один раз связать более двух таблиц:
Запрос: Вывести фамилии работников, назначенных на здания офисов.
SELECT Фамилия
FROM Работник, Работа, Здание
WHERE Работник. № работника = Работа. № работника AND
Работа. № здания = Здание. № здания AND
Тип = 'офис'
Результат:
Фамилия
И. Петров
Команды SQL этого запроса создают одну таблицу из трех реляционных таблиц БД. Первые две таблицы создаются по «№ работника», после чего к полученной таблице присоединяется третья таблица по «№ здания». Условие «Тип = 'офис'« команды WHERE приводит к исключению всех строк, кроме относящихся к офисным зданиям. Это соответствует требованиям запроса.