Copy to XI field Магазин, Продукция, Факт && проекция
Следующий пример проекции - это получение справочника ХЗ цен на продукцию:
useW2
сopy to ХЗ field Продукция, Цена
Х3 | |
Продукция | Цена |
Гидрокостюм Лыжи Лыжи Коньки |
Значительным неудобством в ХЗ является наличие одинаковых строк. В реляционной алгебре требуется, чтобы результат проекции не содержал одинаковых строк, однако практически такие СУБД, как dBASE, не обеспечивают этого. Правильным результатом проекции Х4 = W2[Продукция, Цена] является отношение
Отношение с заданной структурой зачастую можно получить из различных исходных отношений БД. В этом случае, естественно, не гарантируются одинаковые результаты.
Пусть нам необходим список отделов учреждения. В базе данных имеются отношения Служащий (Фамилия, Отдел,...) и Технолог (Фамилия,0тдел,...). Проекция Служащий[0тдел] формирует полный список отделов, а Технолог[0тдел] может содержать меньше значений, если в некоторых отделах не работают технологи.
Выборкой называется операция, которая переносит в результирующее отношение те строки из исходного отношения, которые удовлетворяют условию выборки. Условие выборки проверяется в каждой строке отношения по отдельности и не может охватывать информацию из нескольких строк. Существуют две простейшие разновидности условия выборки:
1. Условие вида Имя_атрибута <знак сравнения> Значение,
где допускаются знаки сравнения =,#,>,=>,<,<=. Например, Цена > 100.
2. Условие вида Имя_атрибута_1 <знак сравнения> Имя_ атрибута_2. Например, Факт > План.
Имена атрибутов должны содержаться в структуре исходного отношения. Алгебраическая запись выборки имеет вид
T=R[p],
где R - исходное отношение;
Т - результирующее отношение;
р - условие выборки.
В качестве примера получим значения Х5 = W 1 [Продукция = "Лыжи"]
В СУБД dBASE выборка реализуется командой copy сопциейfor,
например, use W1 copy to X6 for Факт => План
В команде copy условия выборки и проекции могут присутствовать одновременно, но атрибуты условия выборки должны включаться в условие проекции.
Операции объединения, пересечения и вычитания производятся над двумя исходными отношениями с одинаковой структурой. Точных аналогов этих операций в dBASE нет.
Обозначим исходные отношения через R1 и R2, а результирующее через Т.
Объединение Т = U(R1, R2) содержит строки, присутствующие либо в отношении R1, либо в R2.
ПересечениеТ = I(R1, R2) содержит строки, присутствующие в отношениях R1 и R2 одновременно.
Вычитание Т = M(R1, R2) содержит те строки из R 1, которые отсутствуют в R2.
Если справочник цен на продукцию Х4 необходимо дополнить новыми сведениями из отношения W3, то надо выполнить объединение
Х7 | |
Продукция | Цена |
Лодка ка | |
Палатка | |
Лыжи | |
Коньки | |
Гидрокостюм |
Х7 = U (Х4, W3).
W3 | |
Продукция | Цена |
Лодка Палатка |
В dBASE предусмотрена операция добавленияappend, которая для нашего примера реализуется командами
useX4
append from W3,
что приводит к добавлению в отношение Х4 всех строк из отношения W3. Отличия добавления от объединения создание результирующего отношения на месте исходного отношения и возможность появления одинаковых строк в результирующем отношении.
Операция соединения отношений выполняется над двумя исходными отношениями и создает одно результирующее. Каждая строка первого исходного отношения сопоставляется по очереди со всеми строками второго отношения, и если для этой пары строк соблюдается условие соединения, то они сцепляются и образуют очередную строку в результирующем отношении. Условие соединения имеет вид:
Имя_атрибута_1 <знак сравнения> Имя_атрибута_2,
где Имя_атрибута_1 находится в одном исходном отношении, а Имя_атрибута_2 - в другом. Будем использовать следующее обозначение операции соединения:
T=Rl[p]R2,
где R1 и R2 - исходные отношения,
Т - результирующее отношение, р - условие соединения.
Практически наиболее важный частный случай соединения называется натуральным соединением и имеет следующие особенности:
• знаком сравнения в условии соединения является "=",
• Имя_атрибута_1 и Имя_атрибута_2 должны совпадать, а точнее, содержать пересечение списков атрибутов исходных отношений,
• список атрибутов результирующего отношения образуется в результате объединения списков атрибутов исходных отношений.
Обозначение натурального соединения не содержит условия соединения и имеет вид Т = R1 * R2.
Если требуется сведения о продаже продукции из отношения W1 дополнить данными о ценах на продукцию из отношения Х, то задача решается с помощью соединения
Х8 | |||||
Магазин | Продукция | План | Факт | Продукция | Цена |
Динамо Динамо Спорттовары Спорттовары | Гидрокостюм Лыжи Лыжи Коньки | 1200 2000 | 1400 200 170 100 | Гидрокостюм Лыжи Лыжи Коньки |
Первая строка из W1 и первая строка из Х7 удовлетворяют условию Продукция = Продукция, поэтому сцепляются. Остальные строки из Х7 не будут сцепляться с первой строкой из W1 (условие не соблюдается). Вторая строка из W1 при сравнении со всеми строками из Х7 сцепится только с третьей строкой и т. д. Если применять операцию натурального соединения, то в отношении Х8 будет отсутствовать второй столбец с именем Продукция.
В СУБД DBASE для проведения соединения необходимо использовать две области для исходных отношений:
SELECT 1
USE W1 && открытие отношения W1
SELECT 2
USE Х7 && открытие отношения Х7
SELECT 1
JOIN WITH Х7 TO X9 FOR Продукция=Х7->Продукция FIELDS Магазин, Продукция, Х7->Цена, План, Факт
Опция with называет второе исходное отношение, опция for содержит условие соединения, опция fields перечисляет имена атрибутов результирующего отношения. В приведенном примере выполнено натуральное соединение и передвинут столбец Цена.
В ряде случаев соединение дает некорректные результаты, например:
X10=W1*W2
содержит неоднократно одинаковые сообщения о выпуске продукции только потому, что эти виды продукции используют несколько комплектующих изделий.Х10
1.6.1Х10 | |||||
Магазин | Продукция | План | Факт | Цена | Компл |
Динамо | Гидрокостюм | А1 | |||
Динамо | Лыжи | В23 | |||
Динамо | Лыжи | С23 | |||
Спорттовары | Лыжи | В23 | |||
Спорттовары | Лыжи | С23 | |||
Спорттовары | Коньки | С2 | |||
Вообще говоря, ограничения, которые присутствуют в исходных отношениях, определенным образом трансформируются в ограничения для отношений, полученных в результате применения операций реляционной алгебры. Соответствующие закономерности будут рассмотрены в п. 2.2 в связи с анализом ограничений, присущих реляционной модели данных.
Натуральное соединение определено и в тех случаях, когда соединяемые отношения совпадают по структуре или не содержат общих атрибутов. Если структура отношений R и S одинакова, то R * S выполняет фактически пересечение I(R,S).
Когда отношения R и S не содержат общих атрибутов, считается, что условие соединения выполнено для любой пары сопоставляемых строк отношений, и R * S сцепляет каждую строку из R со всеми строками из S.
Операция натурального соединения имеет ряд свойств, например коммутативность и ассоциативность.
Свойство коммутативности означает, что операции
1.6.1.1 X1=R*S и X2=S*R
порождают, в сущности, одно и то же отношение.
Свойство ассоциативности означает, что операция
Y1=(R*S)*T и операция Y2=R*(S*T)
дают одинаковый результат. Различия, безусловно, состоят в неодинаковом порядке строк XI и Х2 (Y1 и Y2 соответственно). Кроме того, промежуточные отношения при вычислении Y1 и Y2 могут иметь резко различающиеся размеры (число строк), хотя Y1 и Y2 содержат равное число строк.
Описание операции деления отношений начнем с примера. Пусть существует отношение Y(ФИО, ЯП), где для каждого программиста с фамилией ФИО указываются языки программирования ЯП, которые он знает.
Необходимо выделить фамилии программистов, знающих языки Си и Фортран одновременно. Попытка воспользоваться операцией выборки
X11 = Y[ ЯП = "Си" AND ЯП = "Фортран"]
(через AND обозначена логическая операция "и") будет безуспешной, так как в одной строке отношения нет информации о двух языках программирования сразу, и отношение X11 будет пустое.
Определим операцию, называемую "образ". В отношении Т(А,В) образом значения атрибута А является множество значений атрибута В, и каждый элемент b этого множества образует вместе с а некоторую строку (или часть строки) отношения Т.
imB(a)={bl,b2,...,bk},
где im - знак операции "образ",
а - значение, образ которого вычисляется, В - имя атрибута для образа значения а, b1, b2,...,bk - значения атрибута В.
Стоящая перед нами задача решается путем вычисления образов значений "Си" и "Фортран" и последующего пересечения найденных образов.
im ФИО("Си") = {"Иванов","Петpoв» , «Семин»}
im ФИО(«Фортран») = {"Иванов","Семин","Яшин"}
im ФИО("Си")ÇФИО("Фортран")= {"Иванов","Семин")
Такая связка операций взятия образа и пересечения полученных множеств (количество значений, для которых вычисляется образ, может быть произвольным, а не 2, как в нашем примере) требуется достаточно часто, поэтому вводится специальная
Операция - деление.
Условимся, что существует отношение-делимое W(A,B) (в нашем примере это Y) и отношение-делитель V(A). Для необходимого нам запроса отношение-делитель имеет вид;
Результатом операции деления является отношение Q(B), содержащее пересечение образов всех строк отношения-делителя V(A), вычисленных на основе отношения-делимого W(A,B).
Q = D (W,V).
где D - знак операции деления.
Результат деления XI 2 = D (Y,Z) содержит следующие значения:
XI 2 |
ФИО |
Иванов Семин |
В СУБД семейства DBASE отсутствует операция деления отношений, и для реализации деления отношений необходима специальная программа
Декларативный подход к обработке реляционных баз данных основан на интерпретации понятий и методов математической логики. В частности, реляционное исчисление базируется на исчислении предикатов.