- •Лабораторная работа 2. Многотабличные запросы
- •Общие сведения
- •Объединение таблиц по равенству
- •Запросы с использованием отношения предок/потомок
- •Условия для отбора строк
- •Запросы на выборку к трем и более таблицам
- •Прочие объединения таблиц по равенству
- •Особенности многотабличных запросов
- •Полные имена столбцов
- •Производительность при обработке многотабличных запросов
Запросы на выборку к трем и более таблицам
SQL позволяет объединять данные из трех или более таблиц, используя ту же самую методику, что и для объединения данных из двух таблиц.
Пример 2.4. Вывести список для всех поставок, включая объем поставки, наименование поставщика и наименование комплектующего для поставок, объем которых превышает 700.
Select Quantity, Sname, Pname
From Delivery, Supplier, Product
Where Delivery.SID = Supplier.SID and
Delivery.PID = Product.PID and
Quantity > 700
Результат:
Quantity Sname Pname
----------- ------------- --------------
800 R-Style Soc-A Gigabyte
900 Формоза Soc-478
800 Формоза Soc-603
В SQL-запросе используются два внешних ключа таблицы Delivery. Столбец SID является внешним ключом для таблицы Supplier; он связывает каждую поставку с поставщиком, выполняющим её. Столбец PID является внешним ключом для таблицы Product, связывая каждую поставку с комплектующим, включенным в поставку. Т.е. запрос связывает каждую поставку с соответствующим поставщиком и комплектующим.
SQL-запрос может быть сформирован и к большему числу таблиц.
Пример 2.5. Вывести список для всех поставок, включая объем поставки, наименование поставщика, наименование комплектующего и наименование проекта для поставок, объем которых превышает 700.
Select Sname, Pname, NameProject, Quantity
From Delivery, Supplier, Product, Project
Where Delivery.SID = Supplier.SID and
Delivery.PID = Product.PID and
Delivery.KID = Project.KID and
Quantity > 700
Результат
Sname Pname NameProject Quantity
---------- --------------- ------------- -------
R-Style Soc-A Gigabyte Комета 800
Формоза Soc-478 Восток 900
Формоза Soc-603 Сириус 800
Прочие объединения таблиц по равенству
Огромное множество многотабличных запросов основано на отношениях предок/потомок, но в SQL не требуется, чтобы связанные столбцы представляли собой пару «внешний ключ − первичный ключ». Любые два столбца из двух таблиц могут быть связанными, если только они имеют сравнимые типы данных.
Пример 2.6. Вывести список наименования всех поставщиков, город поставщика и наименования комплектующих, находящихся в одном и том же городе, что и поставщик.
Select Sname, Pname, Supplier.City
From Supplier, Product
Where Supplier.City = Product.City
Результат:
Sname Pname City
----------------- ----------------- -------------
Информатика Soc-370 Ростов-на-Дону
Вист-Дон Soc-370 Ростов-на-Дону
Информатика Soc-478 Ростов-на-Дону
Вист-Дон Soc-478 Ростов-на-Дону
Sunrise Server Dual Москва
Формоза Server Dual Москва
Sunrise Soc-A ASUS Москва
Формоза Soc-A ASUS Москва
R-Style Soc-A Gigabyte Санкт-Петербург
Результатами SQL-запроса являются пары строк из таблиц Supplier и Product, имеющие одинаковые значения в столбцах City. Указанные столбцы не являются ни внешним ключом. Тем не менее СУБД с готовностью объединяет таблицы в соответствии с запросом. Следует отметить, что при задании условия выборки необходимо использовать полные имена атрибутов (Supplier.City = Product.City), чтобы не произошел конфликт имен при выполнении SQL-запроса.
Связанные столбцы, подобные приведенным в данном примере, создают между двумя таблицами отношение «многие-ко-многим». Т.е. городу поставщика могут соответствовать множество комплектующих, находящихся в том же городе. В то же время для комплектующего, находящегося в определенном городе, могут быть поставлены в соответствие несколько поставщиков из того же города.
Отношение «многие-ко-многим» отличается от отношения «один-ко-многим», создаваемого, когда в качестве связанных столбцов используются первичный и внешний ключи. Можно подвести следующие итоги:
-
в объединении, созданном путем связи первичного ключа с внешним ключом, всегда существует отношение «один-ко-многим» (предок/потомок);
-
в других объединениях также могут существовать отношения «один-ко-многим», если по крайней мере в одной таблице связанный столбец содержит уникальные значения во всех строках;
-
в общем случае в объединениях, созданных на основе произвольных связанных столбцов, существуют отношения «многие-ко-многим».
Обратите внимание на то, что отличия трех этих ситуаций не влияют на форму записи инструкции SELECT, выражающей объединение. Объединения всех трех типов записываются одним и тем же способом: в предложение WHERE включается операция сравнения связанных столбцов. Тем не менее сделанные выводы полезны для понимания того, как запрос, сформулированный на естественном языке, превратить в правильную инструкцию SELECT.