Базы данных. Учебное пособие

       

Многотабличные запросы


Возможность  связывать  элементы  данных  вне  границ  одной  таблицы  важна  для  любого  языка  баз  данных.  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  приводит  к  исключению  всех  строк,  кроме  относящихся  к  офисным зданиям.  Это  соответствует  требованиям  запроса.


Содержание раздела