Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб. раб_2.doc
Скачиваний:
9
Добавлен:
19.11.2018
Размер:
254.98 Кб
Скачать

Запросы с использованием отношения предок/потомок

Среди многотабличных запросов наиболее распространены запросы к двум таблицам, связанным с помощью отношения предок/потомок. Запрос о поставках и поставщиках в примере 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]