- •Лабораторная работа 2. Многотабличные запросы
- •Общие сведения
- •Объединение таблиц по равенству
- •Запросы с использованием отношения предок/потомок
- •Условия для отбора строк
- •Запросы на выборку к трем и более таблицам
- •Прочие объединения таблиц по равенству
- •Особенности многотабличных запросов
- •Полные имена столбцов
- •Производительность при обработке многотабличных запросов
Запросы с использованием отношения предок/потомок
Среди многотабличных запросов наиболее распространены запросы к двум таблицам, связанным с помощью отношения предок/потомок. Запрос о поставках и поставщиках в примере 2.1 является примером такого запроса. У каждой поставки (потомка) есть соответствующий ей поставщик (предок), и каждый поставщик (предок) может участвовать во многих поставках (потомках). Пары строк, из которых формируются результаты запроса, связаны отношением предок/потомок.
Связи отношений предок/потомок в реляционной базе данных определяются первичными и внешними ключами. Таблица, содержащая внешний ключ, является потомком, а таблица с первичным ключом − предком. Чтобы использовать в запросе отношение предок/потомок, необходимо задать условие отбора, в котором первичный ключ сравнивается с внешним.
Пример 2.2. Вывести список для всех поставок, включая объем поставки, наименование проектов.
Select Quantity, NameProject
From Delivery, Project
Where Delivery.KID = Project.KID
Результат:
Quantity NameProject
--------- --------------
100 Заря
200 Старт
400 Заря
500 Восток
200 Буран
600 Старт
100 Сириус
300 Комета
200 Вымпел
700 Восток
100 Восток
500 Буран
400 Буран
800 Вымпел
500 Комета
300 Заря
900 Восток
500 Вымпел
600 Восток
100 Сириус
500 Комета
800 Восток
700 Буран
Таблица Delivery (потомок) содержит столбец KID, который является внешним ключом для таблицы Project (предок). Здесь отношение предок/потомок используется с целью поиска в таблице Project для каждой поставки соответствующей строки, содержащей наименование проекта, и включения его в результаты запроса.
SQL не требуется, чтобы связанные столбцы были включены в результаты многотабличного запроса. На практике они чаще всего и не включаются, как это было в двух предыдущих примерах. Это связано с тем, что первичные и внешние ключи, как правило, представляют собой идентификаторы (такие как идентификатор поставщика или идентификатор проекта в приведенных примерах), которые трудно запомнить, тогда как соответствующие названия запомнить гораздо легче. Поэтому вполне естественно, что в предложении WHERE для объединения двух таблиц используются идентификаторы, а в предложении SELECT для создания столбцов результатов запроса − более удобные для восприятия имена.
Условия для отбора строк
В многотабличном запросе можно комбинировать условие отбора, в котором задаются связанные столбцы, с другими условиями отбора, чтобы еще больше сузить результаты запроса.
Пример 2.3. Вывести список для всех поставок, включая объем поставки, наименование поставщика и город, в котором находится поставщик, для поставок, объем которых превышает 700.
Select Quantity, Sname, City
From Delivery, Supplier
Where Delivery.SID = Supplier.SID and
Quantity > 700
Результат:
Quantity Sname City
----------- ---------- -------
800 R-Style Санкт-Петербург
900 Формоза Москва
800 Формоза Москва
Вследствие применения дополнительного условия отбора число строк в таблице результатов запроса уменьшилось. Согласно первому условию (Delivery.SID = Supplier.SID) из таблиц Delivery и Supplier отбираются пары строк, которые имеют соответствующее отношение предок/потомок; согласно второму условию производится дальнейший отбор только тех пар строк, где объем поставок превышает 700.