Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Несколько связанных столбцов




Таблицы orders и products в учебной базе данных связаны парой составных ключей. Столбцы mfr и product в таблице orders вместе образуют внешний ключ для таблицы products и связаны с ее столбцами mfr _ id и product _ id соответственно. Чтобы объединить таблицы на основе такого отношения предок/потомок, необходимо задать обе пары связанных столбцов, как показано в данном примере:

Условие поиска показывает, что связанными парами строк таблиц orders и products являются те, в которых пары связанных столбцов содержат одни и те же значения. Объединения посредством нескольких столбцов распространены меньше, чем объединения посредством одного столбца, и обычно встречаются в запросах с составными внешними ключами, как в приведенном выше примере.

ЗАПРОСЫ НА ЧТЕНИЕ К ТРЕМ И БОЛЕЕ ТАБЛИЦАМ

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

В этом запросе используются два внешних ключа таблицы orders. Столбец cust является внешним ключом для таблицы customers; он связывает каждый заказ с клиентом, сделавшим его. Столбец rep является внешним ключом для таблицы salesreps, связывая каждый заказ со служащим, принявшим его. Проще говоря, запрос связывает каждый заказ с соответствующими клиентом и служащим.

А вот еще один запрос к трем таблицам, в котором используется другая комбинация отношений предок/потомок:

В первом отношении снова используется столбец cust из таблицы orders в качестве внешнего ключа для таблицы customers. Во втором отношении используется столбец custjrep из таблицы customers в качестве внешнего ключа для таблицы salesreps. Проще говоря, данный запрос связывает каждый заказ с клиентом, а каждого клиента — с закрепленным за ним служащим.

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

Фактически, он на один шаг расширяет последовательность объединения в предыдущем запросе, связывая заказ с клиентом, клиента — с закрепленным за ним служащим, а служащего — с его офисом.

Прочие объединения таблиц по равенству

Огромное множество многотабличных запросов основано на отношения предок/потомок, но в SQL не требуется, чтобы связанные столбцы представляли собой пару "внешний ключ — первичный ключ". Любые два столбца из двух таблиц могут быть связанными столбцами, если только они имею сравнимые типы данных. Вот пример запроса, в котором связанными столбцами являются столбцы с датами:

Результатами запроса являются пары строк из таблиц orders и salesreps, имеющие одинаковые значения в столбцах ORDER _ DATE И HIRE _ DATE. Эти столбцы не являются нивнешним ключом, ни первичным ключом, да и вообще отношение между строками этих пар, надо признать, довольно странное: общее у заказов и служащих только то, что они появились в компании в один день. Тем не менее, SQL с готовностью объединяет таблицы в соответствии с запросом.

Связанные столбцы, подобные приведенным в данном примере, создают между двумя таблицами отношение "многие-ко-многим". Может быть получено много заказов в день приема на работу какого-нибудь служащего, и в день получения какого-нибудь заказа на работу может быть принято несколько служащих. В нашем примере 12 октября 1989 года было получено три заказа (112968, 112975 и 112979), и в тот же день на работу было принято двое служащих (Ларри Фитч и Мэри Джонс). Три заказа и двое служащих дают шесть строк в таблице результатов запроса.

Отношение "многие-ко-многим" отличается от отношения "один-ко-многим", создаваемого, когда в качестве связанных столбцов используются первичный и внешний ключи. Можно подвести следующие итоги:

• В объединении, созданном путем связи первичного ключа с внешним ключом, всеща существует отношение "один-ко-многим" (предок/потомок).

• В других объединениях также могут существовать отношения "один-ко-многим", если по крайней мере в одной таблице связанный столбец содержит уникальные значения во всех строках.

• В общем случае в объединениях, созданных на основе произвольных связанных столбцов, существуют отношения "многие-ко-многим". Обратите внимание на то, что отличия трех этих ситуаций не влияют на форму записи оператора select, выражающего объединение. Объединения всех трех типов записываются одним и тем же способом: в предложение where включается операция сравнения связанных столбцов. Тем не менее, сделанные выводы полезны для понимания того, как запрос, сформулированный на естественном языке, превратить в правильный оператор select.

 


 

ОБЪЕДИНЕНИЕ ТАБЛИЦ ПО НЕРАВЕНСТВУ

Термин "объединение" применяется к любому запросу, который объединяет данные из двух таблиц базы данных путем сравнения значений в двух столбцах этих таблиц. Самыми распространенными являются объединения^ созданные на основе равенства связанных столбцов (объединения по равенству). Кроме того, SQL позволяет объединять таблицы с помощью других операций сравнения. В приведенном ниже примере для объединения таблиц используется операция сравнения "больше ч^м" (>):

Как и во всех запросах к двум таблицам, каждая строка результатов запроса получается из пары строк, в данном случае содержащихся в таблицах salesreps и offices. Условие поиска

QUOTA > TARGET

отбирает пары строк, в которых значение столбца quota из таблицы salesreps превышает значение столбца target из таблицы offices. Обратите внимание: выбранные из таблиц salesreps и offices пары строк связаны только таким образом; в частности, не требуется, чтобы строка таблицы salesreps представляла служащего, который работает в офисе, представленном строкой таблицы offices. Следует признать, что данный пример имеет несколько искусственный характер и является иллюстрацией того, почему столь мало распространены объединения по неравенству. Однако они могут оказаться полезными в приложениях, предназначенных для поддержки принятия решений, и в других приложениях, исследующих более сложные взаимосвязи в базе данных.

ОСОБЕННОСТИ МНОГОТАБЛИЧНЫХ ЗАПРОСОВ

Многотабличные запросы, рассмотренные до сих пор, не требовали применения специальных синтаксических форм или каких-либо других особенностей языка SQL помимо тех, что использовались для создания однотабличных запросов. Однако некоторые многотабличные запросы нельзя создать без использования дополнительных особенностей языка SQL, описанных в следующих параграфах. В частности:

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

• В многотабличных запросах особый смысл имеет выбор всех столбцов

(SELECT *).

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

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




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 391; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.