
Лекция 13. Реляционная алгебра (часть 2).
План лекции
-
Понятие вложенности операций.
-
Соединение.
-
Естественное соединение.
-
Внешнее соединение.
-
Тeта – соединение.
-
Деление отношений.
-
Присвоение.
-
Примеры использования операций.
Понятие вложенности операций.
Это последовательный выбор операций реляционной алгебры, без явного присвоения имени промежуточной таблице результатов.
Например: Кто из торговых агентов (таблица SALESPERSON) получает менее 11% комиссионных (поле COM)?
7.Соединение.
Используется для связи данных, размещенных в двух таблицах. Это одна из наиболее часто используемых операций реляционной алгебры. У нее есть несколько версий: естественное соединение, тета-соединение и внешнеее соединение.
Естественное соединение - это операция соединения, связывающая таблицы, когда их общие столбцы имеют равные значения.
Естественное соединение обозначают следующим образом:
JOIN (< имя таблицы 1 >, < имя таблицы 2 >)
Эти таблицы должны иметь один или несколько общих столбцов.
Пример.
Первая таблица
«Темы документов по НИР с охраняемыми сведениями »
Рег. № |
Тематика |
13/1-с |
Топливо |
251-сс |
Боезаряд |
1455-с |
Двигатель |
И-43- с |
Привод |
Обозначения: с-секретно; сс-совершенно секретно. Вторая таблица
« Журнал выдачи документов сотрудникам»
-
Рег. №
Дата
Фамилия
12435
11/01/09
Иванов И.И.
65432
11/01/09
Иванов П.П.
251-сс
11/02/09
Петров П.П.
И-43с
11/02/09
Сидоров С.С.
123-н/с
11/03/09
Петров П.П.
345
11/03/09
Егоров Е.Е.
1455-с
11/04/09
Петров П.П.
675-н/с
11/04/09
Сидоров. С.С.
И-43с
11/05/09
Петров П.П.
Естественное соединение выполнено по полю «Рег. №».
«Сотрудники, работавшие с документами, содержащими охраняемые сведения».
Рег. № |
Тематика |
Дата |
Фамилия |
251-сс |
Боезаряд |
11/02/09 |
Петров П.П. |
1455-с |
Двигатель |
11/04/09 |
Петров П.П. |
И-43с |
Привод |
11/02/09 |
Сидоров С.С. |
И-43с |
Привод |
11/03/09 |
Петров П.П. |
Пример более сложной операции естественного соединения:
Дано.
Таблица Клиент:
-
Идентификатор клиента
Имя клиента
Адрес
100
И – 100
А – 100
101
И – 101
А – 101
105
И – 105
А – 105
110
И – 110
А – 110
Таблица Продажи:
Дата |
Идентиф. клиента |
Идентиф. торгового агента |
Идентиф. товара |
Количество |
02/28/09 |
100 |
10 |
2241 |
200 |
02/12/09 |
101 |
23 |
2518 |
300 |
02/05/09 |
105 |
10 |
2241 |
100 |
02/22/09 |
110 |
37 |
2518 |
150 |
02/14/09 |
100 |
10 |
2249 |
50 |
Задача
Необходимо получить данные о клиентах, которые производили закупки, через торгового агента с номером 10.
1. Сначала выбираем продажи, относящиеся к торговому агенту с номером 10. В таблице они выделены. Таких продаж 3. Для этого необходимо использовать операцию выборки, с условием идентификации торгового агента равно 10.
2. Теперь выполним соединение полученной таблицы, с таблицей Клиент, по равенству значений в столбце: Идентификатор клиента. Такими значениями являются: 100, 105, 100. Для этого создадим произведение этих таблиц содержащее (3+5) столбцов и (4*3) строк.
4. Из полученной таблицы исключаем все строки, кроме тех, в столбцах которых, с именем Идентификатор клиента, имеются одинаковые значения (операция выборки).
5. Поскольку теперь столбцы, Идентификатор клиента (полученные в результате соединения таблиц), имеют одинаковые значения, то один из них можно удалить. Это операция проекции. В результате этих операций получаем, так называемое, естественное соединение.
Замечание. В таблице Продажи мы нашли три строки типа Продажа 10 (10–идентификатор торгового агента). Каждой из этих строк в столбце Клиент соответствует только одна строка потому, что Идентификатор клиента – это внешний ключ в таблице Продажи. Таким образом, в таблице естественное соединение будет тоже три строки.
Таблица . Естественное соединение
Дата |
Идентиф. торг. агента |
Идентиф. товара |
Кол-во |
Идентиф. клиента |
Имя клиента |
Адрес |
02/28/09 |
10 |
2241 |
200 |
100 |
И – 100 |
А– 100 |
02/05/09 |
10 |
2241 |
100 |
105 |
И – 105 |
А – 105 |
02/14/09 |
10 |
2249 |
50 |
100 |
И – 100 |
А – 100 |
Внешнее соединение обозначается так:
OUTERJOIN (<имя таблицы 1>, < имя таблицы 2>)
Оно расширяет естественное соединение и гарантирует, что каждая запись из обеих исходных таблиц, будет представлена в таблице соединения, хотя бы один раз.
Оно выполняется в два этапа: сначала выполнятся естественное соединение, а затем, если какая-либо строка одной из исходных таблиц, не подходит ни к какой строке второй таблицы, она включается в таблицу соединения, а все дополнительные столбцы, заполняются пустыми значениями.
Тeта – соединение.
Пример. Дана таблица ТОРГОВЫЙ АГЕНТ. Одни торговые агенты являются менеджерами (управляющими) других агентов. Подобные ситуации встречаются в рекурсивном отношении.
Таблица ТОРГОВЫЙ АГЕНТ
Запрос: идентифицировать торговых агентов, чьи менеджеры получают комиссионные более 11%. Все данные находятся в одной таблице Торговый агент. Однако такой запрос нельзя выполнить простой операцией выборки, т.к. размер комиссионных в записи относится к торговому агенту, а не к его менеджеру.
Мы должны присоединить запись о менеджере к записи о торговом агенте, т.е. должны соединить таблицу саму с собой. Тогда размер комиссионных менеджера будет стоять в той же строке, что и имя торгового агента. Мы можем легко завершить запрос.
Проанализируем таблицу. Первая строка таблицы содержит информацию об Иванове. Идентификатор его менеджера равен 27. Это Чернов. Размер его комиссионных равен 15%. Следовательно торговый агент Иванов должен быть включен в результат запроса, но не Чернов.
Решение задачи:
Сначала создаются две копии этой таблицы. Затем они соединяются по результатам столбцов «Идентификатор торгового агента» и «Идентификатор менеджера».
Затем выполняется выборка > 11%, потом проекция со столбцом фамилии, а затем возможна проекция на определенные столбцы.
SP1:=SALESPERSON
SP2:=SALESPERSON
A:=JOIN(SP1,SP2: SP1.MANAGER_ID=SP2.SALPERS_ID)
Кроме знака =, в условии могут использоваться ≠, <, >, ≤, ≥.
Дополнительный пример: Дана таблица SALESPERSON (торговый агент), в которой среди других столбцов присутствует столбец комиссионных (COMM_%).
Столбец COMM_%
-
…
10
11
9
13
10
15
12
11
10
…
Ответим на вопрос: Каков максимальный размер комиссионных?
Кажется, что у нас вроде бы нет способа сравнить все значения в столбце размера комиссионных, чтобы определить какое из них максимально. Однако, Тeта-соединение сравнивает по крайней мере две строки. Воспользуемся им и свяжем таблицу саму с собой.
A:= SALESPERSON [COMM_%]
B:=A
C:=JOIN(A,B : A. COMM_% > B. COMM_%)
-
A. COMM_%
B. COMM_%
10
11
11
13
13
13
13
15
15
15
15
15
12
12
12
9
10
9
10
11
9
12
10
11
9
12
13
10
11
9
Левый столбец содержит все варианты значения комиссионных, кроме минимального – 9.
Правый столбец содержит все варианты значений, кроме максимального – 15.
Вычтем правый столбец из множества комиссионных.
D:=C[B. COMM_%]
Получим максимальное значение – E=15.
E:=A-D
8. Деление.
Предположим, что нам известны и доступны две таблицы: «ТОВАРЫ» и «ПРОДАЖИ».
Таблица Товары
Идентиф. товара |
Название |
1035 |
Свитер |
2241 |
Лампа |
2249 |
Пылесос |
2518 |
Велосипед |
Необходимо выполнить следующий запрос:
Перечислить торговых агентов, которые продали каждый из этих товаров хотя бы один раз.
Ответ на этот запрос можно получить выполнив операцию деления.
Шаг1. Создаем проекцию по полю Идентификатор товара
Таблица PR1
-
Идентиф.
товара
1035
2241
2249
2518
Шаг2. Создаем таблицу, содержащую информацию о результатах продаж. Это делается проектированием таблицы ПРОДАЖИ на столбцы: Идентификатор товара и Идентификатор торгового агента.
Таблица PR2
Идентиф. торгового агента |
Идентиф. товара |
10 |
2241 |
23 |
2518 |
23 |
1035 |
39 |
2518 |
37 |
2518 |
10 |
2249 |
23 |
2249 |
23 |
2241 |
Операция даления обозначается следующим образом:
A:=PR2 / PR1
Анализ таблицы PR2:
Торговый агент 10 продал только две разновидности.
Торговый агент 23 продал все четыре разновидности.
Торговый агент 39 продал одну разновидность.
Торговый агент 37 продал тоже одну разновидность.
Таким образом, ответ :
Торговый агент 23.
Ответ
Идентиф. торг. агента |
23 |
Пример операции деления
Таблица-делимое:
Поездки граждан в Германию:
-
Ф.И.О.
Турфирма
Город
Иванов И.И.
“Евротур”
Берлин
Иванов И.И.
“Веси”
Гамбург
Петров П.П.
“Евротур”
Гамбург
Петров П.П.
“Веси”
Берлин
Сидоров С.С.
“Евротур”
Берлин
Сидоров С.С.
“Веси”
Гамбург
Таблица-делитель:
Требуемое сочетание турфирм и городов Германии
Турфирма |
Город |
“Евротур” |
Берлин |
“Веси” |
Гамбург |
|
|
Итоговая таблица:
Граждане с требуемым сочетанием турфирм и городов
Ф.И.О. |
Иванов И.И. |
Сидоров С.С. |
Операция деления является обратной операцией произведения.