3.5 Реализация операций реляционной алгебры
Еще раз последовательно рассмотрим основные операции РА на примерах.
Для каждой операции РА выполним следующие действия:
составим реляционное выражение;
определим результат выполнения операции (теоретический);
составим 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).
Данная таблица относится к РТ. Сформулируем ее основные свойства:
кардинальное число (количество записей) – 5;
степень (количество полей ) – 4;
ключевое поле – А;
таблицы упорядочены по полю А;
функциональные зависимости отсутствуют.
Ограничение т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 очевидны следующие свойства РТ:
кардинальное число – 5;
степень – 3;
ключевое поле – А;
таблица упорядочены по полю А.
Будем считать, что задана только часть т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