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

3.5 Реализация операций реляционной алгебры

Еще раз последовательно рассмотрим основные операции РА на примерах.

Для каждой операции РА выполним следующие действия:

  1. составим реляционное выражение;

  2. определим результат выполнения операции (теоретический);

  3. составим SQL-команду запроса для реализации указанной операции.

При подготовке конспекта запросы были реализованы средствами СУБД. Идентичность теоретического и практического результатов позволил сделать выводы о правильной реализации операций РА средствами SQL-команд.

Рассмотрим сначала унарные операции. В качестве примера рассмотрим таблицу тG

A B C D

1 B1 C1 D1

3 B3 C1 D1

4 B4 C2 D2

8 B8 C6 D2

10 B1 C1 D3

Для наглядности имена полей выделены жирным шрифтом, а числа в значениях поля В выбраны такими, что они соответствует значениям поля А. Исключение составляет запись А=10, когда В=1 (т.е. 10 без 0).

Данная таблица относится к РТ. Сформулируем ее основные свойства:

  1. кардинальное число (количество записей) – 5;

  2. степень (количество полей ) – 4;

  3. ключевое поле – А;

  4. таблицы упорядочены по полю А;

  5. функциональные зависимости отсутствуют.

Ограничение тG Where A>3

A B C D

4 B4 C2 D1

8 B8 C6 D3

10 B1 C1 D2

Реализация

SELECT тG.* FROM тG WHERE (тG.A>3)

Напомним, что для получения РТ в результате запроса обязательно необходимо исключать повторяющиеся записи. Это можно выполнять путем применения предикатов или группировки.

Проекция тG [B, C]

B C

B1 C1

B3 C1

B4 C2

B8 C6

Для получения требуемой проекции применим SQL-команду с группировкой:

SELECT тG.B, тG.C FROM тG ROUP BY тG.B, тG.C

Далее рассмотрим бинарные операции. Для этого рассмотрим две таблицы: тG и тQ.

тQ

A B C

1 B1 C1

2 B2 C1

3 B3 C1

4 B4 C2

5 B5 C3

Для тQ очевидны следующие свойства РТ:

  1. кардинальное число – 5;

  2. степень – 3;

  3. ключевое поле – А;

  4. таблица упорядочены по полю А.

Будем считать, что задана только часть тQ и в целом значение любого поля не зависит от значения другого, т.е. в тQ отсутствуют функциональные зависимости.

Большинство свойств у тG и тQ одинаковы, за исключением разной степени, т.е. количества полей.

Для выполнения основных операций добьемся совместимости таблиц по типу и уравняем количество полей. Исключим из тG поле D и создадим не запрос, а новую таблицу тR. Для этого применим операцию проекции, исключающую поле D

тR := тG [A,B,C]

A B C

1 B1 C1

3 B3 C1

4 B4 C2

8 B8 C6

10 B1 C1

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

SELECT DISTINCT тG.A, тG.B, тG.C INTO тR

FROM тG ORDER BY тG.A.

Отметим, что предикат DISTINCTROW в данном случае запроса к одной таблице был бы проигнорирован.

Теперь таблицы тR и тQ совместимы по типу. С ними можно проводить бинарные операции РА.

Для удобства результаты будем сортировать по полю А, но опцию порядочения ORDER BY тR.A [,тQ.A] в SQL-команду и конечный знак (;) записывать не будем.

Объединение

тR Union тQ

A B C

1 B1 C1

2 B2 C1

3 B3 C1

4 B4 C2

5 B5 C3

8 B8 C6

10 B1 C1

Для правильного практического результата можно применить одну из двух команд:

SELECT тR.* FROM тR UNION SELECT тQ.* FROM тQ

SELECT * FROM тR UNION SELECT * FROM тQ

Пересечение

тR Intersect тQ

A B C

1 B1 C1

3 B3 C1

4 B4 C2

Для правильного результата можно применить одну из двух команд:

а) пересечение за счет общего объединения по полю А

SELECT тR.A, тR.B, тR.C FROM тQ

INNER JOIN тR ON тQ.A=тR.A

б) пересечение за счет условий отбора

SELECT тR.A, тR.B, тR.C FROM тR, тQ

WHERE ((тR.A=тQ.A) AND (тR.B=тQ.B) AND (тR.C=тQ.C))

Разность

тR Minus тQ

A B C

8 B8 C6

10 B1 C1

Для правильной практической реализации запроса достаточно проверить только одно поле на значение Null

SELECT тR.A, тR.B, тR.C FROM тR

LEFT JOIN тQ ON тR.A = тQ.A

WHERE (тQ.B Is Null)

Разность

тQ Minus тR

A B C

2 B2 C1

5 B5 C3

SELECT тQ.*

FROM тQ LEFT JOIN тR ON тQ.A = тR.A

WHERE (тR.B Is Null)

Произведение может применяться только к таблицам, которые не имеют одинаковых имен полей. Так как мы оперируем с полными именами полей, включающими и имена полей, и имена источников, то можно считать, что это условие выполняется.

тR Times тQ

тR.A тR.B тR.C тQ.A тQ.B тQ.C

1 B1 C1 1 B1 C1

1 B1 C1 2 B2 C1

1 B1 C1 3 B3 C1

1 B1 C1 4 B4 C2

1 B1 C1 5 B5 C3

3 B3 C1 1 B1 C1

3 B3 C1 2 B2 C1

3 B3 C1 3 B3 C1

3 B3 C1 4 B4 C2

3 B3 C1 5 B5 C3

4 B4 C2 1 B1 C1

4 B4 C2 2 B2 C1

4 B4 C2 3 B3 C1

4 B4 C2 4 B4 C2

4 B4 C2 5 B5 C3

8 B8 C6 1 B1 C1

8 B8 C6 2 B2 C1

8 B8 C6 3 B3 C1

8 B8 C6 4 B4 C2

8 B8 C6 5 B5 C3

10 B1 C1 1 B1 C1

10 B1 C1 2 B2 C1

10 B1 C1 3 B3 C1

10 B1 C1 4 B4 C2

10 B1 C1 5 B5 C3

Ниже приведены три идентичные команды, которые дают одинаковый результат

а) SELECT тR.*, тQ.* FROM тR, тQ

б) SELECT тR.A, тR.B, тR.C, тQ.A, тQ.B, тQ.C FROM тR, тQ

в) SELECT * FROM тR, тQ;

Соединение

R Join Q по С

тR.A тR.B C тQ.A тQ.B

1 B1 C1 1 B1

1 B1 C1 2 B2

1 B1 C1 3 B3

3 B3 C1 1 B1

3 B3 C1 2 B2

3 B3 C1 3 B3

4 B4 C2 4 B4

10 B1 C1 1 B1

10 B1 C1 2 B2

10 B1 C1 3 B3

SELECT тR.A, тR.B, тR.C, тQ.A, тQ.B

FROM тR INNER JOIN тQ ON тR.C = тQ.C

Условное больше-соединение по А

тR Join тQ WHERE тR.A > тQ.A

тR.A тR.B тR.C тQ.A тQ.B тQ.C

3 B3 C1 1 B1 C1

3 B3 C1 2 B2 C1

4 B4 C2 1 B1 C1

4 B4 C2 2 B2 C1

4 B4 C2 3 B3 C1

8 B8 C6 1 B1 C1

8 B8 C6 2 B2 C1

8 B8 C6 3 B3 C1

8 B8 C6 4 B4 C2

8 B8 C6 5 B5 C3

10 B1 C1 1 B1 C1

10 B1 C1 2 B2 C1

10 B1 C1 3 B3 C1

10 B1 C1 4 B4 C2

10 B1 C1 5 B5 C3

SELECT * FROM тR, тQ WHERE тR.A > тQ.A

Условное равно-соединение по А

тR Join тQ WHERE тR.A = тQ.A

тR.A тR.B тR.C тQ.A тQ.B тQ.C

1 B1 C1 1 B1 C1

3 B3 C1 3 B3 C1

4 B4 C2 4 B4 C2

SELECT * FROM тR, тQ WHERE тR.A=тQ.A

Композиция тR + тQ (по В)

тR.A тR.C тQ.A тQ.C

1 C1 1 C1

3 C1 3 C1

4 C2 4 C2

10 C1 1 C1

SELECT тR.A, тR.C, тQ.A, тQ.C

FROM тR, тQ WHERE тR.B = тQ.B

47

Соседние файлы в папке Обработка РБД-relalg