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

Реляционная операция произведения двух отношений TIMES реализуется в SQL, если указать имена этих отношений в предложении FROM:

SELECT * FROM Проекты, Поставки;

Если дополнить эту команду предложением WHERE, сравнивающим значения атрибутов этих отношений, то будет реализована реляционная операция соединения JOIN: Например, соединение отношений Проекты и Поставки:

SELECT * FROM Проекты, Поставки WHERE Проекты.ПрN=Поставки.ПрN;

Подобным образом можно соединить произвольное число отношений:

SELECT DISTINCT П.Имя_П, Д.Имя_Д, Пр.Имя_Пр, Пк.Кол FROM Поставщики П, Детали Д, Проекты Пр, Поставки Пк WHERE Д.ДN=Пк.ДN AND П.ПN=Пк.ПN AND Пр.ПрN=Пк.ПрN AND Пк.Кол>500;

Такое соединение выполняется с конца. Сначала из таблицы Поставки удаляются строки со значениями поля Кол менее или равным 500. Затем соединяются кортежи отношения Поставки с теми кортежами отношения Проекты, у которых совпадают значения атрибута ПрN. После этого кортежи созданного представления соединяются с кортежами отношения Поставщик, у которых совпадают значения атрибута ПN. Далее, полученные кортежи соединяются с кортежами отношения Детали, у которых совпадают значения атрибута ДN.

Для организации соединений между таблицами и их объединения может быть использован и оператор JOIN…ON, который указывает на подключаемую таблицу и связь между полями:

SELECT список полей FROM имя таблицы {INNER/LEFT/RIGHT} JOIN связанная таблица ON условие связи [WHERE условие отбора] [ORDER BY столбцы сортировки];

В приведенной инструкции показано, как оператор JOIN окружен именами двух связываемых таблиц, причем вместо правого имени может использоваться повторно конструкция JOIN … ON, называемая вложенной: [имя таблицы {INNER/LEFT/RIGHT} JOIN связанная таблица ON условие связи]. В этом случае первая таблица соединяется с соединением второй и третьей таблиц. Инструкция SQL может содержать набор нескольких вложенных конструкций JOIN … ON. Их число обычно равно общему количеству таблиц, включенных в запрос, минус один. Перед оператором JOIN должен быть указан тип соединения:

  • INNER – соединяет записи из двух таблиц, если связующие поля этих таблиц содержат одинаковые значения;

  • LEFT (RIGHT) – соединяет записи исходных таблиц, причем левое внешнее соединение включает все записи из первой (левой) таблицы и присоединяет к ним записи из второй таблицы, если связующие поля содержат одинаковые значения. Правое внешнее соединение включает все записи из второй (правой) таблицы и присоединяет к ним записи из первой таблицы, если связующие поля содержат одинаковые значения.

Конструкция ON условие связи позволяет описать два поля и связь между ними (одно поле в таблице связанная таблица, второе – в таблице имя таблицы). В выражении условие связи присутствует оператор сравнения значений полей, который возвращает значения True или False. Если значение выражения True, то объединенная запись включается в результирующий набор.

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

SELECT DISTINCT Пр.Имя_Пр, Пр.Гор, Пк.ДN, Пк.Кол FROM (Проекты Пр INNER JOIN Поставки Пк) ON Пр.ПрN=Пк.ПрN;

Соединения представляют собой мощный инструмент для организации сложных запросов. Например, соединение таблицы самой с собой позволяет формировать всевозможные комбинации пар. Допустим, надо узнать, какие детали поставляются несколькими поставщиками. Соединение таблицы Поставки с таблицей Поставки по значению поля ДN даст всевозможные пары поставщиков:

SELECT F.ПN, S.ПN, F.ДN FROM Поставки AS F, Поставки AS S WHERE F.ДN=S.ДN;

В

F.ПN

S.ПN

F.ДN

П1

П1

Д1

П1

П1

Д1

П1

П5

Д1

П1

П1

Д1

П1

П1

Д1

П1

П5

Д1

П5

П1

Д1

П5

П1

Д1

П5

П5

Д1

...

...

...

результате выполнения этой команды будет создано представление, фрагмент которого показан на рисунке.

Добавив условие выборки

AND F.ПN <> S.ПN

убираем строки, содержащие одинаковые номера поставщиков. Модификатор DISTINCT удалит повторяющиеся кортежи. Если бы в полях F.ПN и S.ПN были данные числового типа, то условие выборки AND F.ПN < S.ПN позволило бы получить ответ без последующих операций.

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