Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диго С.М. Базы данных проектирование и использование.doc
Скачиваний:
721
Добавлен:
14.05.2016
Размер:
12.04 Mб
Скачать

Предложение from

Общая характеристика. В предложении FROM задаются табли­цы, участвующие в запросе. Поскольку в Access не поддерживается механизм создания представлений (VIEW)6, то это могут быть либо реальные таблицы БД (причем таблицы и активной БД, и внешней БД), либо ранее запомненные запросы.

Синтаксис предложения FROM:

FROM выражение [IN внешняяБазаДанных].

Имена таблиц, участвующих в запросе, могут быть перечислены через запятую. Тогда условие соединения таблиц будет задано в пред­ложении WHERE либо в самом предложении FROM. В последнем случае в качестве выражения используются операции INNER JOIN, LEFT JOIN или RIGHT JOIN.

Предложение FROM должно присутствовать в каждой инструк­ции SELECT.

Внешняя база данных - это база данных, поддерживающая про­токол ODBC, такая, как база данных Microsoft® SQL Server™, обыч­но расположенная на удаленном сервере. Для повышения быстродей­ствия и облегчения применения рекомендуется использовать присое­динение таблиц вместо предложения IN при загрузке данных из внешней базы данных.

Соединение таблиц с использованием операции JOIN. Выше, говоря об определении полей, выводимых в ответ, нам уже пришлось коснуться проблемы соединения таблиц. Рассмотрим этот вопрос бо­лее детально. Классическая операция соединения (JOIN) предпола­гает, что каждая строка первой таблицы по заданному условию срав­нивается с каждой строкой второй таблицы, и если условие выполня­ется, то соответствующие строки сцепляются, образуя очередную строку в результирующем отношении. В принципе условие сравнения может быть любым, но чаще всего используется условие соеди­нения по равенству значений соответствующих полей. Такое соеди­нение называется естественным соединением. В SQL Access данная операция называется INNER JOIN.

Нельзя в качестве полей, по которым проводится соединение таб­лиц, использовать поля, имеющие тип MEMO или OLE.

Пусть в БД имеются таблицы «Кафедры» и «Сотрудники». В таб­лице «Кафедры» присутствуют поля «Код_кафедры», «Наименование_ кафедры_полное» и «Наименование_кафедры_краткое». В таблице «Сотрудники» есть поле Код_кафедры, но отсутствуют наименова­ния кафедр. В предметной области возможны ситуации, что некото­рые сотрудники не приписаны ни к одной кафедре, и могут быть ка­федры, к которым не приписано ни одного сотрудника.

Тогда, если требуется получить список сотрудников кафедр(ы) и в запросе используется наименование кафедры, следует использовать операцию INNER JOIN.

Кроме операции INNER JOIN в SQL Access имеются операции LEFT JOIN и RIGHT JOIN. Операции LEFT JOIN и RIGHT JOIN на­зываются в документации по Access внешним объединением7.

Так, для отбора всех кафедр (в том числе тех, в которых нет ни одного сотрудника) или всех сотрудников (в том числе тех, которые не приписаны ни к какой кафедре) следует использовать операцию LEFT JOIN или RIGHT JOIN соответственно.

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

Операция JOIN выглядит следующим образом:

FROM таблица1 INNER|LEFT|RIGHT JOIN таблица2 ON таблица! поле1 = таблица2.поле2.

Поля связи должны иметь соответствующие друг другу тип дан­ных и длину. Имена полей связи могут различаться, однако при про­ектировании БД желательно давать одинаковые имена полям, кото­рые имеют одинаковое смысловое значение, и, напротив, поля, раз­личающиеся по смыслу, следует называть разными именами.

Операции JOIN могут быть вложенными. В этом случае исполь­зуется следующий синтаксис:

SELECT список полей

FROM таблица1 INNER JOIN

(таблица2 INNER JOIN [(]таблицаЗ

[INNER JOIN [(]таблицаХ [INNER JOIN ...)] ON таблицаЗ.полеЗ =

таблицаХ.полеХ)]

ON таблица2.поле2 = таблицаЗ.полеЗ)

ON таблица1 .поле1 = таблица2.поле2;

На рис. 7.6 приведен пример запроса, использующего три табли­цы. Для его изображения на SQL будет использована вложенная опе­рация JOIN.

Запрос на SQL, соответствующий запросу, изображенному на рис. 7.6, будет выглядеть следующим образом:

SELECT сотрудник.ФИО, предмет.название_предмета_краткое

FROM сотрудник

INNER JOIN (предмет

INNER JOIN вл_предмет ON предмет.Код_предмета = вл_предмет.-

код_предмета)

ON сотрудник.Код_сотрудника = вл_предмет.код_сотрудника;

Если не использовать предложение JOIN для выполнения опера­ций объединения нескольких таблиц, результирующий объект Recordset нельзя будет изменять.

Вместо вложенной операции JOIN можно использовать подчинен­ный запрос.