|
Программирование >> Sql: полное руководство
быть связанными, если только они имеют сравнимые типы данных. Вот пример запроса, в котором связанными являются столбцы с датами: Найти все заказы, полученные в тот день, когда на работу был принят новый служащий. SELECT ORDER NDM, AMOUNT, ORDERDATE, NAME FROM ORDERS, SALESREPS WHERE ORDER DATE = HIRE DATE ORDER NUM AMOUNT ORDER DATE NAME 112968 112979 112975 112968 112979 112975 $3,978.00 $15,000.00 $2,100.00 $3,978.00 $15,000.00 $2,100.00 12-OCT-89 12-OCT-89 12-OCT-89 12-OCT-89 12-OCT-89 12-OCT-89 Mary Jones Mary Jones Mary Jones Larry Fitch Larry Fitch Larry Fitch Как показано на рис 7.8, результатами запроса являются пары строк из таблиц orders и salesreps, имеющие одинаковые значения в столбцах 0RDER date и hire date. Эти столбцы не являются ни внешним ключом, ни первичным ключом, да и вообще отношение между этими парами строк, надо признать, довольно странное: общее у заказов и служащих только то, что они появились в компании в один день. Тем не менее, СУБД с готовностью объединяет таблицы в соответствии с запросом. Таблица SALESREPS EHPL NUH NAHE 105 109 102 106 104 101 110 108 103 107 Bill Adams Hary Jones Sue Smith Sam Clark Bob Smith Dan Roberts Tom Snyder Larry Fitch Paul Cruz Nancy Angel Ii HIRE OATE 12zFEac88, 10-DEC-86 14-JUN-88 19-HAY-87 20-0CT-86 13-JAN-90 сзостЗз oTTOFe? 14-N0V88 Таблица ORDERS Рис. 7.8. Объединение, в котором не исЬользуются первичные и внешние ключи Связанные столбцы, подобные приведенным в данном примере, создают между двумя таблицами отношение многие-ко-многим . Может поступить много заказов в день приема на работу какого-нибудь служащего, а также в день получения какогьнибудь заказа на работу может быть принято несколько служащих. В нашем при!Йере 12 октября 1989 года было получено три заказа (112968, 112975 и 112979), и в тот же день на работу было принято двое служащих (Ларри Фитч и Мэри Джонс). Три заказа и двое служащих дают шесть строк в таблице результатов запроса. Отношение многие-ко-многим отличается от отношения один-ко-многим , создаваемого, когда в качестве связанных столбцов используются первичный и внешний ключи. Можно подвести следующие итоги: в объединении, созданном путем связи первичного ключа с внешним ключом, всегда существует отношение один-ко-многим (предок/потомок); в других объединениях также могут существовать отношения один-ко-многим , если по крайней мере в одной таблице связанный столбец содержит уникальные значения во всех строках; в общем случае в объединениях, созданных на основе произвольных связанных столбцов, существуют отношения многие-ко-многим . Обратите внимание на то, что отличия трех этих ситуаций не влияют на форму записи инструкции select, выражающей объединение. Объединения всех трех типов записываются одним и тем же способом: в предложение where включается операция сравнения связанных столбцов. Тем не менее, сделанные выводы полезны для понимания того, как запрос, сформулированный на естественном языке, превратить в правильную инструкцию select. Объединение таблиц по неравенству Термин объединение применяется к любому запросу, который объединяет данные из двух таблиц базы данных путем сравнения значений в двух столбцах этих таблиц. Самыми распространенными являются объединения, созданные на основе равенства связанных столбцов (объединения по равенству). Кроме того, SQL позволяет объединять таблицы с помощью других операций сравнения. В приведенном ниже примере для объединения таблиц используется операция сравнения больше чем (>): Получить все комбинации служащих и офисов, где плановый объем продаж служащего больше, чем план какого-либо офиса. SELECT NAME, QUOTA, CITY, TARGET FROM SALESREPS, OFFICES WHERE QUOTA > TARGET NAME QUOTA CITY TARGET Bill Adams $350,000.00 Denver $300,000.00 Sue Smith $350,000.00 Denver $300,000.00 Larry Fitch $350,000.00 Denver $300,000.00 Как и во всех запросах к двум таблицам, каждая строка результатов запроса получается из пары строк, в данном случае содержащихся в таблицах salesreps и offices. Условие QDOTA > TARGET отбирает пары строк, в которых значение столбца quota из таблицы salesreps Превышает значение столбца target из таблицы offices. Обратите внимание: выбранные из таблиц salesreps и offices пары строк связаны только таким образом; в частности, не требуется, чтобы строка таблицы salesreps представляла служащего, который работает в офисе, представленном строкой таблицы offices. Следует признать, что данный пример носит несколько искусственный характер и является иллюстрацией того, почему столь мало распространены объединения по неравенству. Однако они могут оказаться полезными в приложениях, предназначенных для поддержки принятия решений, и в других приложениях, исследующих более сложные взаимосвязи в базе данных. Особенности многотабличных запросов Многотабличные запросы, рассмотренные до сих пор, не требовали применения специальных синтаксических форм или каких-либо других особенностей языка SQL помимо тех, что использовались для создания однотабличных запросов. Однако некоторые многотабличные запросы нельзя создать без использования дополнительных особенностей языка SQL, описанных в следующих параграфах. В частности: иногда в многотабличных запросах требуется использовать полные имена столбцов, чтобы исключить неоднозначные ссылки на столбцы; . в многотабличных запросах особый смысл имеет выбор всех столбцов (select *); для создания многотабличных запросов, связывающих таблицу саму с собой, создаются самообъединения; в предложении from часто используются псевдонимы таблиц, чтобы упростить полные имена столбцов и обеспечить однозначность ссылок на столбцы в самообъединении. Полные имена столбцов в учебной базе данных имеется несколько случаев, когда две таблицы содержат столбцы с одинаковыми именами. Например, столбцы с именем sales имеются в таблицах offices и salesreps. В столбце sales таблицы offices содержится объем продаж на текущий день для каждого офиса; в аналогичном столбце таблицы salesreps содержится текущий объем продаж для каждого служащего. Обычно с этими двумя столбцами затруднений не возникает, поскольку в предложении from задается соответствующая таблица, как в следующих примерах: Показать названия городов, в которых фактический объем продаж превышает плановый. SELECT CITY, SALES FROM OFFICES WHERE SALES > TARGET Показать имена служащих, у которых объемы продаж превышает $350000. SELECT NAME, SALES FROM SALESREPS WHERE SALES > 350000.00 Однжо вот запрос, в котором одинаковые имена столбцов представляют проблему:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |