Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по базам данных 2005.docx
Скачиваний:
62
Добавлен:
29.10.2018
Размер:
148.31 Кб
Скачать

5.3 Соединение трех и более таблиц

Возможно включение в запрос нескольких таблиц с использованием различных типов соединений. Соединения осуществляются попарно, то есть сначала соединяются две таблицы и образуется промежуточная виртуальная таблица; затем промежуточная таблица соединяется с третьей и так далее. Рассмотрим возможные соединения таблиц для базы данных, состоящей из четырех таблиц. Схема данных представлена на рис. 5.3.1.

Рис. 5.3.1 Схема данных для базы данных, состоящей из четырех таблиц

Для наглядности введем следующие условные обозначения:

Т1 INNER JOIN T2 – T1 + T2 (внутреннее соединение таблиц Т1 и Т2)

Т1 LEFT JOIN T2 – T1 T2 (левое соединение таблиц Т1 и Т2)

Т1 RIGHT JOIN T2 – T1 T2 (правое соединение таблиц Т1 и Т2)

С использованием введенных обозначений внутреннее соединение таблиц Т1 и Т2 можно записать следующим образом:

Т1 + Т2 on <условие>.

Внутреннее соединение трех таблиц Т1, Т2, Т3 можно записать при помощи следующих инструкций:

(Т1 + Т2 on <условие1>) + Т3 on <условие2>;

(Т2 + Т1 on <условие1>) + Т3 on <условие2>;

Т3 + (Т1 + Т2 on <условие1>) on <условие2>;

Т3 + (Т2 + Т1 on <условие1>) on <условие2>.

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

Рассмотрим левое соединение таблицы Т1 с внутренним соединением таблиц Т2 и Т3:

Т1 (Т1 + Т3 on <условие1>) on <условие2>.

Если поменять местами таблицу Т1 и внутреннее соединение таблиц Т2 и Т3, необходимо левое соединение заменить на правое:

(Т1 + Т3 on <условие1>) Т1 on <условие2>.

Результаты выполнения запроса при этом будут идентичны. Таблиц в соединении может быть больше трех. При этом рассмотренные правила будут соблюдаться для любого количества таблиц.

5.4 Запрос на выборку

Запрос на выборку является наиболее распространенным типом запросов и представляет собой прежде всего реализацию операции реляционной алгебры, которая называется выборкой.

Рассмотрим порядок написания запросов на выборку с использованием инструкций языка SQL. Для этого можно использовать следующий шаблон:

Select <список полей>;

From < связка таблиц >;

[Where < условие отбора записей>];

[Order by <ключи сортировки>].

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

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

Инструкция Order by используется для сортировки результата запроса по определенному ключу.

Угловые скобки являются метасимволами, которые при построении реального запроса должны быть заменены чем-то подходящим по смыслу.

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

В приведенном шаблоне запроса на выборку инструкции Select и From являются обязательными, в то время как инструкции Where и Order by могут отсутствовать.

Перечисление списка полей начинается с ключевого поля Select и может включать имена полей физических таблиц, имена полей из других запросов (виртуальных таблиц) и выражения. Если одно и тоже имя используется в нескольких таблицах, в списке полей обязательно необходимо уточнить, из какой таблицы будет получено данное поле. При этом сначала указывается имя таблицы, а затем имя поля: [ИмяТаблицы].[ИмяПоля]. Квадратные скобки в данном случае являются символами, обозначающими, что используется системные имена. В списке полей могут также присутствовать выражения. При написании выражения могут использоваться константы различных типов, имена полей таблиц, входящих в запрос, функции (как системные, так и пользовательские). При включении выражения в текст запроса используется следующий шаблон: <выражение> as <псевдоним>. Сначала пишется само выражение, а затем после служебного слова Аs указывается псевдоним. Псевдонимы можно указать и для полей, которые не являются выражениями, чтобы заменить системные имена на более понятные. Например, для определения суммы поставки выражение будет выглядеть следующим образом: [Количество]*[Цена] as [Сумма].

В связке таблиц указываются имена всех таблиц и запросов и параметры их объединения. При указании параметров объединения указывается вид объединения: внутреннее, или внешнее. При создании внешнего соединения в обязательном порядке уточняется, какое это соединение: левое или правое. В условии объединения обязательно указываются имена полей, по которым будут связаны таблицы. При необходимости в запросе может быть указано условие отбора записей, например, Where[Сумма]>=100000. Приведенная команда выбирает все записи, сумма для которых превышает 100000. Условие отбора может быть составным. При этом используются логические операторы and, or, not.

Ключи сортировки позволяют упорядочить результаты запроса и вывести эти результаты на экран в определенном порядке. Упорядочить поставки по датам можно следующим образом: Order by[Дата Поставки].

Рассмотрим базу данных “Поставки” и примеры создания запросов на выборку для этой базы. Схему структуры предметной области представим на рис. 5.4.1

Рис.5.4.1 Схема структуры предметной области базы данных “Поставки”

Следующим шагом по проектированию структуры предметной области является составление словаря имен. Сокращения из словаря имен будут использоваться для образования системных имен полей таблиц. Составим словарь имен для базы данных “Поставки”, результаты представим в табл. 5.4.1.

Таблица 5.4.1

Словарь имен базы данных “Поставки”

Слово

Сокращение

Поставщик

Пост

Товар

Тов

Наименование

Наим

Адрес

Адр

Цена

Цена

Дата

Дата

Количество

Кол

Сумма

Сум

Код

Код

Отметим, что база данных “Поставки”, представленная в настоящем примере, существенно упрощена и не учитывает многих особенностей предметной области, с которыми приходится сталкиваться в действительности. Однако эта база данных приемлема как учебный пример.

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

Для этого необходимо написать следующий запрос на языке SQL:

Select Поставка.КодПост, ДатаПост, НаимПост, АдрПост, Товар.КодТов, НаимТов,

Цена, КолТов, КолТов*Цена as Сумма

From (Поставщик Inner Join Поставка on Поставщик.КодПост = Поставка.КодПост)

Inner Join Товар on Товар.КодТов = Поставка.КодТов

Order by ДатаПост