Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

19.1.1. Внешние соединения

Но имеются два важных частных случая соединений, которые выражаются с помощью традиционных средств SQL излишне громоздко,- это естественные и внешние соединения. При наличии возможности определения внешних ключей таблицы кажется достаточно странной потребность всякий раз явно указывать в запросах условие естественного соединения. Например, во многих примерах запросов в лекции 18 присутствует условие соединения EMP.DEPT_NO = DEPT.DEPT_NOв тех случаях, когда в действительности нам требовался результат операцииEMP NATURAL JOIN DEPT.

Внешние соединения были введены еще Эдгаром Коддом в 1979 г. [2.2]. В целом, основная идея этой разновидности операции соединения состояла в том, что, с одной стороны, результат операции обычного соединения двух отношений повышает информационный уровень данных, поскольку в результате операции мы имеем информационно связанные данные. Но, с другой стороны, в результирующем отношении мы теряем информацию об исходных объектах, которые оказались несвязанными и не вошли в результат соединения. Кодд придумал, как, используя неопределенные значения, определить обобщенную операцию, которая будет обладать достоинствами обычной операции соединения, не приводя к потере исходной информации. Вернее, он предложил три операции: левое внешнее соединение, правое внешнее соединение и полное (симметричное) внешнее соединение. Приведем их определения (в реляционных терминах данного курса).

Пусть имеются отношенияr1иr2, совместимые относительно операции взятия расширенного декартова произведения. Пустьsявляется результатом операцииr1 LEFT OUTER JOUN r2 WHERE comp(левое внешнее соединениеr1иr1по условиюcomp). ТогдаHs = Hr1 union Hr2. Пустьtr1 Br1иtr2 Br2. Тогдаtr1 union tr2 Bsв том и только в том случае, когдаcomp (tr1 union tr2) = true. Если имеется кортежtr1 Br1, для которого нет ни одного кортежаtr2 r2, такого, чтоcomp (tr1 union tr2) = true, тоtr1 union tr2null Bs, гдеtr2null– кортеж, соответствующийHr2, все значения которого являются неопределенными140).

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

Пусть sявляется результатом операцииr1 RIGHT OUTER JOUN r2 WHERE comp(правое внешнее соединениеr1иr2по условиюcomp). ТогдаHs = Hr1 union Hr2. Пустьtr1 Br1иtr2 Br2. Тогдаtr1 union tr2 Bsв том и только в том случае, когдаcomp (tr1 union tr2) = true. Если имеется кортежtr2 Br2, для которого нет ни одного такого кортежаtr1 Br1, чтоcomp (tr1 union tr2) = true, тоtr1null union tr2 Bs, гдеtr1null– кортеж, соответствующийHr1, все значения которого являются неопределенными.

Наконец, пусть sявляется результатом операцииr1 FULL OUTER JOUN r2 WHERE comp(полное внешнее соединениеr1иr2по условиюcomp). ТогдаHs = Hr1 union Hr2. Пустьtr1 Br1иtr2 Br2. Тогдаtr1 union tr2 Bsв том и только в том случае, когдаcomp (tr1 union tr2) = true. Если имеется кортежtr1 Br1, для которого нет ни одного кортежаtr2 Br2, такого, чтоcomp (tr1 union tr2) = true, тоtr1 union tr2null Bs, гдеtr2null– кортеж, соответствующийHr2, все значения которого являются неопределенными. Если имеется кортежtr2 Br2, для которого нет ни одного кортежаtr1 Br1, такого, чтоcomp (tr1 union tr2) = true, тоtr1null union tr2 Bs, гдеtr1null– кортеж, соответствующийHr1, все значения которого являются неопределенными.

Понятно, что традиционными средствами SQL можно выразить все виды внешних соединений (например, с использованием переключателей), но такие запросы будут очень громоздкими. Компании-производители SQL-ориентированных СУБД пытались обеспечивать выразительные средства внешних соединений путем расширения системы обозначений для операций сравнения. Этот подход был не слишком удачным и не обеспечивал общего решения.

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

  • прямое соединение;

  • внутреннее соединение по условию;

  • внутреннее соединение по совпадению значений указанных одноименных столбцов;

  • естественное внутреннее соединение;

  • левое внешнее соединение по условию;

  • правое внешнее соединение по условию;

  • полное внешнее соединение по условию;

  • левое внешнее соединение по совпадению значений указанных одноименных столбцов;

  • правое внешнее соединение по совпадению значений указанных одноименных столбцов;

  • полное внешнее соединение по совпадению значений указанных одноименных столбцов;

  • естественное левое внешнее соединение;

  • естественное правое внешнее соединение;

  • естественное полное внешнее соединение;

  • соединение объединением.

Во всех этих операциях нет ничего сложного, но их неформальное описание исключительно громоздко. Поэтому в разделе 19.4. «Более сложные конструкции оператора выборки»мы определяем операции на формальном уровне, а потом иллюстрируем их на примерах.

Наконец, последняя тема этой лекции относится к еще одному типу ссылок на таблицу, допускаемых в разделе FROM: порождаемым таблицам с горизонтальной связью. Фактически порождаемая таблица с горизонтальной связью представляет собой выражение запросов, в котором может присутствовать корреляция со строками таблиц, специфицированных в списке разделаFROM слеваот данной порождаемой таблицы с горизонтальной связью. Наличие порождаемых таблиц с горизонтальной связью требует некоторого уточнения семантики выполнения разделаFROMоператораSELECT. По нашему мнению, это средство является полностью избыточным, хотя и не вредным, поскольку его реализация не должна вызывать затруднений и/или снижать эффективность системы.