Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ud.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
821.25 Кб
Скачать

4.3 Специальные реляционные операторы

Выборкой (ограничением, селекцией) на отношении A с условием c называется отношение с тем же заголовком, что и у отношения A, и телом, состоящем из кортежей, значения атрибутов которых при подстановке в условие c дают значение ИСТИНА. c представляет собой логическое выражение, в которое могут входить атрибуты отношения A и (или) скалярные выражения.

В простейшем случае условие c имеет вид XY, где - один из операторов сравнения (=, <>, <, <=, >, >= и т.д.), а X и Y - атрибуты отношения A или скалярные значения. Такие выборки называются -выборки (тэта-выборки) или -ограничения, -селекции.

Синтаксис операции выборки: A WHERE c, или A WHERE XY

Пример 6. Пусть дано отношение A с информацией о сотрудниках:

Результат выборки A WHERE Стаж>1 будет иметь вид:

ИД_Сотр

Фамилия

Стаж

1

Иванов

3

3

Сидоров

4

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

Проекция

Проекцией отношения A по атрибутам X, Y,…, Z, где каждый из атрибутов принадлежит отношению A, называется отношение с заголовком (X, Y,…, Z) и телом, содержащим множество кортежей вида (x, y,…, z), таких, для которых в отношении A найдутся кортежи со значением атрибута X равным x, значением атрибута Y равным y, …, значением атрибута Z равным z.

Синтаксис операции проекции: A[X, Y,…, Z]

Замечание. Операция проекции дает "вертикальный срез" отношения, в котором удалены все возникшие при таком срезе дубликаты кортежей.

Пример 7. Пусть дано отношение B с информацией о должностях (табл. 6)

Проекция B[Должность] будет иметь вид:

Должность

Профессор

Доцент

Ассистент

Соединение

Операция соединения отношений, наряду с операциями выборки и проекции, является одной из наиболее важных реляционных операций.

Обычно рассматривается несколько разновидностей операции соединения:

  • Общая операция соединения

  • -соединение (тэта-соединение)

  • Экви-соединение

  • Естественное соединение

Наиболее важным из этих частных случаев является операция естественного соединения. Все разновидности соединения являются частными случаями общей операции соединения.

Общая операция соединения

Соединением отношений A и B по условию c называется отношение

(A TIMES B) WHERE c

c представляет собой логическое выражение, в которое могут входить атрибуты отношений A и B и(или) скалярные выражения.

Т. о., операция соединения есть результат последовательного применения операций декартового произведения и выборки. Если в отношениях A и B имеются атрибуты с одинаковыми наименованиями, то перед выполнением соединения такие атрибуты необходимо переименовать.

Тэта-соединение

Пусть отношение A содержит атрибут X, отношение B содержит атрибут Y, а - один из операторов сравнения (=, <>, <, <=, >, >= и т.д.). Тогда -соединением отношения A по атрибуту X с отношением B по атрибуту Y называют отношение: (A TIMES B) WHERE XY

Это частный случай операции общего соединения. Иногда, для операции -соединения применяют следующий, более короткий синтаксис: A[XY]B

Пример 8. Пример 8. Рассмотрим учебное заведение, в котором имеются данные о преподавателях и перечне дисциплин. За каждой дисциплиной закреплен определенный объем часов, а каждый преподаватель имеет определенную нагрузку в часах. Идея в том, что каждый преподаватель не может читать дисциплины, объем которых превышает его возможную нагрузку. Для рассматриваемого примера в таблицах 12 и 13 приведены отношения с соответствующими записями для сотрудников и дисциплин.

Таблица 13 Отношение A (Сотрудники) Таблица 14 Отношение B (Дисциплины)

ИД_Сотр

Фамилия

X

(Нагрузка, часов)

ИД_Дис

Название дисциплины

Y (Объем, часов)

1

Иванов

50

1

ЗИ

36

2

Костров

72

2

УД

54

3

Сидоров

34

3

ОС

18

Ответ на вопрос "какие сотрудники имеют право читать какие дисциплины?" дает -соединение A[X>=Y]B:

ИД_Сотр

Фамилия

X (Нагрузка, часов)

ИД_Дис

Название дисциплины

Y (Объем часов)

1

Иванов

50

1

ЗИ

36

1

Иванов

50

2

ОС

54

2

Костров

72

1

ЗИ

36

2

Костров

72

2

УД

54

2

Костров

72

3

ОС

18

3

Сидоров

34

3

ОС

18

Экви-соединение

Наиболее важным частным случаем -соединения является случай, когда  есть просто равенство.

Синтаксис экви-соединения: A[X=Y]B

Пример 9. Пусть имеются отношения P, D и PD, хранящие информацию о лекторах, дисциплинах и количестве вычитываемых часов (для удобства введем краткие наименования атрибутов):

Таблица 16 Отношение P (Сотрудники) Таблица 17 Отношение D (Дисциплины)

ИД_Сотр

PNAME (Фамилия)

ИД_Дис

Название дисциплины DNAME

1

Иванов

1

ЗИ

2

Костров

2

УД

3

Сидоров

3

ОС

Таблица 18 Отношение PD (Выработка)

ИД_Сотр

ИД_Дис

Общий объем в часах VOLUME

1

1

36

1

2

54

1

3

18

2

1

36

2

2

54

3

1

36

Ответ на вопрос, какие дисциплины вычитываются какими лекторами, дает экви-соединение P[ИД_Сотр=ИД_Сотр]PD. На самом деле, т.к. в отношениях имеются одинаковые атрибуты, то требуется сначала переименовать атрибуты, а потом выполнить экви-соединение. Запись становится более громоздкой:

(P RENAME ИД_Сотр AS ИД_Сотр1)[PNUM1=PNUM2](PD RENAME PNUM AS ИД_Сотр 2)

Обычно, такой сложной формой записи не пользуются. Но как бы то ни было, в результате имеем отношение:

ИД_Сотр1

Фамилия

ИД_Сотр2

ИД_Дис

Общий объем в часах VOLUME

1

Иванов

1

1

36

1

Иванов

1

2

54

1

Иванов

1

3

18

2

Петров

2

1

36

2

Петров

2

2

54

3

Сидоров

3

1

36

Недостатком экви-соединения является то, что если соединение происходит по атрибутам с одинаковыми наименованиями (а так чаще всего и происходит!), то в результирующем отношении появляется два атрибута с одинаковыми значениями. В нашем примере атрибуты ИД_Сотр1 и ИД_Сотр2 содержат дублирующие данные. Избавиться от этого недостатка можно, взяв проекцию по всем атрибутам, кроме одного из дублирующих. Именно так действует естественное соединение.

Естественное соединение

Пусть даны отношения A(A1, A2,…,An; X1, X2, …, Xp) и B(X1, X2,…,Xp; B1, B2,…Bm), имеющие одинаковые атрибуты X1, X2,…,Xp (т.е. атрибуты с одинаковыми именами и определенные на одинаковых доменах).

Тогда естественным соединением отношений A и B называется отношение с заголовком (A1, A2, …, An, X1, X2, …, Xp, B1, B2, …, Bm) и телом, содержащим множество кортежей , таких, что (a1, a2, …, an, x1, x2, …, xp)A и (x1, x2, …, xp, b1, b2, …, bm,)B.

Естественное соединение настолько важно, что для него используют специальный синтаксис: A JOIN B

Замечание. В синтаксисе естественного соединения не указываются, по каким атрибутам производится соединение. Естественное соединение производится по всем одинаковым атрибутам.

Замечание. Естественное соединение эквивалентно следующей последовательности реляционных операций:

  • Переименовать одинаковые атрибуты в отношениях

  • Выполнить декартово произведение отношений

  • Выполнить выборку по совпадающим значениям атрибутов, имевших одинаковые имена

  • Выполнить проекцию, удалив повторяющиеся атрибуты

  • Переименовать атрибуты, вернув им первоначальные имена

Замечание. Можно выполнять последовательное естественное соединение нескольких отношений. Нетрудно проверить, что естественное соединение (как, впрочем, и соединение общего вида) обладает свойством ассоциативности, т.е. (A JOIN B) JOIN C=A JOIN (B JOIN C)

поэтому такие соединения можно записывать, опуская скобки: A JOIN B JOIN C

Пример 10. В предыдущем примере ответ на вопрос "какие дисциплины читаются лекторами", более просто записывается в виде естественного соединения трех отношений P JOIN PD JOIN D (для удобства просмотра порядок атрибутов изменен, это является допустимым по свойствам отношений):

ИД_Сотр

Фамилия

ИД_Дис

Название дисциплины DNAME

Общий объем в часах VOLUME

1

Иванов

1

ЗИ

36

1

Иванов

2

УД

54

1

Иванов

3

ОС

18

2

Петров

1

ЗИ

36

2

Петров

2

УД

54

3

Сидоров

1

ЗИ

36

Деление

Пусть даны отношения A(X1, X2,…,Xn; Y1, Y2,…Ym) и B(Y1, Y2,…Ym), причем атрибуты Y1, Y2,…Ym - общие для двух отношений.

Делением отношений A на B называется отношение с заголовком (X1X2,…,Xn) и телом, содержащим множество кортежей (x1, x2,…xn), таких, что для всех кортежей (y1, y2, …, ym)B в отношении A найдется кортеж (x1x2, …, xn, y1, y2, …, ym).

Отношение A выступает в роли делимого, отношение B выступает в роли делителя. Деление отношений аналогично делению чисел с остатком.

Синтаксис операции деления: A DEVIDEBY B

Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" - "какие преподаватели читают все дисциплины?".

Пример 11. В примере с сотрудниками, дисциплинами и читаемыми дисциплинами ответим на вопрос, "какие сотрудники читают все дисциплины?".

В качестве делимого возьмем проекцию X=PD[ИД_Сотр, ИД_Дис], содержащую номера сотрудников и номера читаемых ими дисциплинами:

ИД_Сотр

ИД_Дис

1

1

1

2

1

3

2

1

2

2

3

1

В качестве делителя возьмем проекцию Y=D[ИД_Дис], содержащую список номеров всех дисциплин (не обязательно вычитываемых кем-либо):

ИД_Дис

1

2

3

Деление X DEVIDE Y дает список номеров преподавателей, вычитывающих все дисциплины:

ИД_Сотр

1

Оказалось, что только сотрудник с номером 1 читает все виды лекций.

Примеры использования реляционных операторов

Пример 12. Получить имена сотрудников, читающих лекцию 2.

Решение: ((DP JOIN P) WHERE ИД_Дис=2)[PNAME]

Пример 13. Получить имена сотрудников, читающих по крайней мере лекцию «ЗИ».

Решение: (((D WHERE DNAME=ЗИ) JOIN DP) JOIN P)[PNAME]

Ответ на этот запрос можно получить и иначе:

(((D JOIN DP) JOIN P) WHERE DNAME=ЗИ)[PNAME]

Пример 14. Получить имена сотрудников, читающих все лекции.

Решение: ((DP[ИД_Сотр, ИД_Дис] DEVIDEBY D[ИД_Дис]) JOIN P)[PNAME]

Пример 15. Получить имена сотрудников, не читающих лекцию 2.

Решение: ((P[ИД_Сотр] MINUS((P JOIN DP) WHERE ИД_Дис=2)[ИД_Сотр] JOIN P)[PNAME]

Ответ на этот запрос можно получить и пошагово:

T1=P[ИД_Сотр] - получить список номеров всех сотрудников;

T2= P JOIN DP - соединить данные о сотрудниках и читаемых лекциях

T3=T2 WHERE ИД_Дис=2 - в данных о сотрудниках и читаемых лекциях оставить только данные о лекции 2.

T4=T3[ИД_Сотр] - получить список номеров сотрудников, читающих лекцию 2.

T5=T1 MIBUS T4 - получить список номеров сотрудников, не читающих лекцию 2.

T6=T5 JOIN P - соединить список номеров сотрудников, не читающих лекцию 2 с данными о сотрудниках (получатся полные данные о сотрудниках, не читающих лекцию 2).

T7=T6[P[NAME] - искомый ответ (имена сотрудников, не читающих лекцию 2).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]