Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гайдамакин Н. А. Автоматизированные информационные системы, базы и банки данных. Вводный курс.doc
Скачиваний:
372
Добавлен:
02.05.2014
Размер:
4.3 Mб
Скачать

4.3.2.1.2. Запросы на выборку данных из нескольких таблиц

Запросы на выборку данных из нескольких таблиц, как пра­вило, предназначены для решения логическихинформационных задач и, в свою очередь, подразделяются натригруппы:

• запросы на сочетание данных;

• запросы на соединение данных;

• запросы на объединение данных.

Запросы на сочетаниестроятся на основе операциискаляр­ного произведения реляционных таблици по смыслу направлены наформирование полного набора сочетании строк-записей,пред­ставленных в исходных таблицах. Запросы на сочетание строятся на основе SQL-инструкции SELECT ипредложения FROM c пpoстым перечислением отбираемых полей и их таблиц.

Для примера на рис. 4.14 приведен запрос на выборку сочета­ния данных из таблицы «Подразделения» и таблицы «Мероприя­тия». Формирование и исполнение такого запроса может быть обус­ловлено потребностями автоматического формирования новой таб­лицы для составления определенных планов или графиков, где нужно предусмотреть в исходном виде полный набор сочетаний данных по подразделениям и по мероприятиям.

Рис. 4.14. Пример реализации запроса на сочетание дачных из двух таблиц

Запросы на соединение,* в свою очередь, подразделяются на запросы на основе внутреннего соединения (INNER JOIN) и запросы на основе правого или левого внешнего соединения(RIGHT JOIN и LEFT JOIN).

* В некоторых источниках данный тип запросов называют запросами на объеди­нение (JOIN).Англ. термин JOIN переводится в глагольном виде как «объединяться», «соединяться», что и обусловливает неодинаковое его использование в русском пере­воде в разных источниках. В данном контексте более правильным является его перевод как «соединение», так как в реляционной модели данных операции «объединения» и «соединения» различны.

Запросы на выборку, строящиеся на основе внутреннего со­единения,реализуют рассматриваемую по реляционной моде­ли данныхоперацию соединения реляционных таблиц.Данная операция является одной из наиболее характерных и частых при решениилогических информационных задач,когда нужно получить и просмотреть данные из разных таблиц,связанных определенной логикой или предварительно установленными в схеме базы данных связями.Напомним, что при реализации опе­рации соединения двух таблиц выделяетсяполе соединения, которое должно быть одинакового типа в соединяемых табли­цах. Результатом соединения таблиц является новая таблица, содержащая все поля, или часть полей первой таблицы и все или часть полей второй таблицы. Строки итоговой таблицы при внутреннем соединении образуются из сцепления строк пер­вой и второй таблиц, когда их значения по соединяемому полю совпадают.

Запросы на внешнее соединение строятся на основе моди­фикации операции соединения. При левом внешнем соедине­нии (LEFT JOIN)строки итоговой таблицы образуются из всех строк первой (левой) таблицы с «прицеплением» строк второй таблицы, если значенияполя соединениясовпадают. Если сре­ди строк второй (правой) таблицы нет строк с соответствую­щим значением поля соединения, то в итоговой таблице присо­единяемые поля заполняются пустыми значениями. При пра­вом внешнем соединении (RIGHT JOIN)строки итоговой таблицы строятся по противоположному правилу.

В большинстве случаев запросы на основе внутреннего со­единения, по сути, являются процессом денормализациисвя­занных таблиц, на которые база данных разделяется при про­ектировании, исходя из требований рационализации размеще­ния данных.

Запросы на соединение реализуются на основе включения в предложение FROMв качестве источника данных конструк­ции вида «имя_1-й_таблицы INNER (LEFT/RIGHT) JOINимя_2-й_таблицыONимя__поля_соединения_1-й_таблицы=имя_поля_соединения_2-й_таблицы». На рис. 4.15 приведен пример реализации операций внутреннего, а также левого и правого внешних соединений таблиц «Сотрудники» и «Исполнение» (до­кументов) по полю «Фамилия».

На рис. 4.15 приведены также варианты построения SQL-инструкций, для реализации соответствующих запросов. Как видно из рисунка, выбортипа соединенияопределяетсяцеля­мидальнейшегоиспользования результатовзапроса.

Рис. 4.15, а. Левое внешнее соединение

При внутреннем соединении целью является получение новой таблицы с итоговыми данными по уже состоявшимся свя­зям.

Рис. 4.15, в. Правое внешнее соединение

Внешнее соединение по смыслу направлено на создание итоговой таблицы для просмотра и анализа состоявшихся и еще несостоявшихся связей. При этом для левого внешнего объеди­нения упор делается на анализ связей от первой таблицы (в нашем случае от сотрудников, чтобы просмотреть и проанали­зировать, кто и какие документы исполнил, а кто вообще не исполнил ни одного документа). Иначе говоря, информация по связямслужит в качестведополнительного аспекта, дополни­тельной характеристики для записей левой таблицы. Для пра­вого внешнего объединения упор делается на анализ связей от второй таблицы (в нашем случае от «Исполнения», чтобы про­смотреть и проанализировать, какие документы исполнены и какими сотрудниками, записи о которых находятся в таблице «Сотрудники»).

В некотором смысле антиподом запросов на соединение является специальный вид запросов на выборку, называемый запросом на поиск записей без подчиненных.

Поиск записей без подчиненных применяется для анализа данных в связанных таблицах, когда связи в силу каких-либо причин не состоялись. Реализуется данный вид запроса на ос­нове запроса на левое (правое) внешнее соединение с дополни­тельным условием отбора записей с пустыми значениями по полю соединения в правой (левой) таблице. По сути, запрос на поиск записей без подчиненных противоположен запросу на внутреннее соединение. Примером запроса по поиску записей без подчиненных, представленным на рис. 4.16, является зап­рос, строящий набор записей по таблице «Сотрудники», кото­рые не исполнили ни одного документа, т. е. не имеют подчи­ненных записей в таблице «Исполнение».

Запросы на соединение могут решать и более сложные ло­гические информационные задачи по анализу связанных дан­ных в цепочках из нескольких таблиц. В качестве примера та­кого рода запросов* можно привести следующий запрос по фор­мированию набора записей сотрудников, командированных в январе 1998 г. в организации г. Саратова со служебным задани­ем «Сопровождение поставок», данные из которого выбирают­ся из последовательно связанных отношением «Один-ко-многим» 4-х таблиц — «Сотрудники», «Командировки», «Пункт командирования», «Задания»:

* В данном случае далеко не самого сложного.

SELECTCoтрудники*

FRОМ((Сотрудники INNERJOINКомандировкиONСо­трудники.ФИО = Командировки.ФИО) INNER JOINЗадания ONКомандировки.Служебное задание=Задания.Наименование)INNER JOINПункт командированияONКомандировки. Пункт командирования = Пункт командирования. Наименование

Рис. 4.16. Пример запроса по поиску записей без подчиненных

WHERE((Пункт командирования.Город) = «Саратов») AND ((Задания.Наименование) = «Сопровождение поставок») AND ((Командировки. Дата убытия) Between #1/1/98#Апd#1/31/98#);

Запросы на объединение данныхреализуютоперацию объединения реляционных таблици решают задачи создания наборов данных, объединяющих однотипные по смыслу запи­си (по группам однотипных полей) из нескольких таблиц. Стро­ятся запросы на объединение через SQL-инструкцию SELECT—UNION SELECT.При этом запрос состоит из первой инструк­ции SELECT,в которой перечисляются отбираемые поля и ус­ловия отбора записей из первой таблицы, и последующих ин­струкций UNION SELECT,в которых указываются отбираемые поля и условия отбора записей из других таблиц. Обязатель­ным условием является одинаковое количество отбираемых полей в первой инструкции SELECTи последующих инструк­циях UNION SELECT.При этом типы и длина полей в первой инструкции и последующих инструкциях могут не совпадать.

При необходимости в итоговом наборе данных наименова­ния отбираемых полей можно изменить через ключевое слово ASпосле соответствующего поля в первой инструкцииSELECT.

По умолчанию повторяющиеся записи не возвращаются, но через использование предиката ALLпосле ключевого словаUNION можно обеспечить режим отбора всех, в том числе и повторяющихся записей.

На рис. 4.17 приведен пример отбора и объединения дан­ных из таблиц «Исходящие» и «Входящие» базы «Документо­оборот» с целью формирования общего списка документов, по­ступивших после 1 декабря 1998 г., и документов, отправлен­ных после 20 декабря 1998 г. В запросе первые и последние поля переименованы, чтобы объединить смысл этих полей в исходных таблицах.