Программирование - это просто
Advertisement
Главная arrow Платный раздел arrow Теория баз данных. arrow Теория баз данных. Урок 2. Операции реляционной алгебры.
23.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Теория баз данных. Урок 2. Операции реляционной алгебры. Печать E-mail
Автор megabax   
26.11.2023 г.
New Page 1

Теория баз данных. Урок 2. Операции реляционной алгебры.

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

 

На прошлом уроке мы с вами разобрали основные понятия реляционной алгебры, узнали, что это вообще такое и с чем ее "едят". Сейчас познакомимся с операциями реляционной алгебры. Итак, операции над отношениям могут быть унарными (когда операция производиться только над одним отношением), бинарными, когда над двумя и тернарными над тремя, только такие практически неизвестны. Начнем с некоторых унарных операций.

Переименование. В результате такой операции возникает новое отношение с другими именами атрибутов. Записывается эта операция вот так: R RENAME Atr1, Atr2, … AS NewAtr1, NewAtr2, …, где R — отношение, подвергаемое операции переименования, Atr1, Atr2, … — исходные имена атрибутов, NewAtr1, NewAtr2, … — новые имена атрибутов. По сути, эта операция - просто присвоение столбцам (всем или только нескольким) других имен.

Выборка. Отношение с тем же заголовком, что и у отношения A, и телом, состоящим из кортежей, значения атрибутов которых при подстановке в условие c дают значение ИСТИНА. c представляет собой логическое выражение, в которое могут входить атрибуты отношения A, а также скалярные выражения.  Записывается эта операция A WHERE c. По сути, выборка - это что-то типа операции select  из языка запросов SQL. Почему "что-то типа"? Потому что реляционная алгебра - это не SQL и отношение - не таблица (см.  прошлый урок). Но определенные сходства с этой операцией из SQL есть. Если вы не знаете, что такое SQL - просто пропускайте мои замечания по поводу SQL мимо ушей, они для тех, кто много работал с базами данных практически, но с теорией знаком слабо.

Проекция. Если из существующего отношения вырезать отдельные столбцы и из полученной таблицы удалить дубликаты кортежей, то получится проекция. Обозначается как A[X, Y, …, Z] или PROJECT A {x, y, …, z}.

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

Объединение. Отношение с тем же заголовком, что и у совместимых по типу отношений A и B, и телом, состоящим из кортежей, принадлежащих или A, или B, или обоим отношениям. Обозначается A UNION B. Думаю, тут надо пояснить, что объединения нельзя сделать с таблицами, у которых разное число столбцов. Если число столбцов одинаково, но у них разные имена, то перед объединением необходимо привести их к одинаковым именам при помощи операции переименования.

Рассмотрим пример. Допустим, у нас есть две таблицы:

ФИО Оклад Премия
Иванов Иван Иванович 20000 10000
Петров Петр Петрович 19000 10000
Кривоногов Дмитрий Васильевич 15000 5000
Анисимова Анна Павловна 17000 6000

и

ФИО Оклад Премия
Иванов Иван Иванович 30000 10000
Петров Петр Петрович 19000 10000
Кривоногов Дмитрий Васильевич 15000 6000
Анисимова Анна Павловна 17000 6000

В результате у нас будет таблица из 6 строк:

ФИО Оклад Премия
Иванов Иван Иванович 20000 10000
Петров Петр Петрович 19000 10000
Кривоногов Дмитрий Васильевич 15000 5000
Иванов Иван Иванович 30000 10000
Кривоногов Дмитрий Васильевич 15000 6000
Анисимова Анна Павловна 17000 6000

Почему из 6 строк? Потому что есть строки, которые присутствуют и в той и в другой таблице (они выделены желтым цветом), а в отношении не должно быть повторов. Операция UNION из языка SQL (по крайней мере, для MySQL точно, я проверял), ведет себя точно так же. Аналогичная операция есть в теории множеств (объединение двух множеств), см. первые нескольких уроках из серии "Математический анализ для чайников".

Пересечение. Отношение с тем же заголовком, что и у отношений A и B, и телом, состоящим из кортежей, принадлежащих одновременно обоим отношениям A и B. Обозначается A INTERSECT B. Операция аналогично объединению из теории множеств. В качестве примера рассмотрим пересечение тех же таблиц, что мы делали операцию объединение. Получиться вот такая таблица с двумя строчками:

ФИО Оклад Премия
Петров Петр Петрович 19000 10000
Анисимова Анна Павловна 17000 6000

Вычитание.  Отношение с тем же заголовком, что и у совместимых по типу отношений A и B, и телом, состоящим из кортежей, принадлежащих отношению A и не принадлежащих отношению B. Обозначается  A MINUS B. Если применить данную операцию к нашим таблицам, то получим:

ФИО Оклад Премия
Иванов Иван Иванович 20000 10000
Кривоногов Дмитрий Васильевич 15000 5000

Декартово произведение. Отношение (A1, A2, …, Am, B1, B2, …, Bm), заголовок которого является сцеплением заголовков отношений A(A1, A2, …, Am) и B(B1, B2, …, Bm), а тело состоит из кортежей, являющихся сцеплением кортежей отношений A и B: a1, a2, …, am, b1, b2, …, bm), таких, что (a1, a2, …, am)ÎA, и (b1, b2, …, bm)Î B.. Обозначается эта операция A TIMES B.

И так, что будет если мы перемножим таблицы из нашего примера? Получиться вот такая хитрая таблица из 16 строк. Но мы для удобства возьмем перемножение таблиц из нашего примера, но состоящие только из двух первых строк. Что бы в итоге у нас получилось не 16, а только 4 строки.

Итак, вот первая исходная таблица:

ФИО Оклад Премия
Иванов Иван Иванович 20000 10000
Петров Петр Петрович 19000 10000

А вот вторая:

ФИО Оклад Премия
Иванов Иван Иванович 30000 10000
Петров Петр Петрович 19000 10000

Результат перемножения:

Таблица1.ФИО Таблица1.Оклад Таблица1.Премия Таблица2.ФИО Таблица2.Оклад Таблица2.Премия
Иванов Иван Иванович 20000 10000 Иванов Иван Иванович 30000 10000
Иванов Иван Иванович 20000 10000 Петров Петр Петрович 19000 10000

Петров Петр Петрович

19000 10000 Иванов Иван Иванович 30000 10000
Петров Петр Петрович 19000 10000 Петров Петр Петрович 19000 10000

Обратите внимание, что в итоговой таблице у нас повторяются имена столбцов, поэтому к ним добавился префикс. Заметьте, в результатирующей таблице нет дублирующихся строк.

На самом деле декартово произведение, как правило, применяют для разных таблиц. Поэтому рассмотрим другой пример.

Таблица 1.

Товар Цена
Сахарный песок 100
Шоколад 70
Пиво 50

Таблица 2.

Магазин Продавец
Кондитерский №1 А. Иванова
Сладкая лавка Д. Петрова

Результат.

Товар Цена

Магазин

Продавец

Сахарный песок 100 Кондитерский №1 А. Иванова
Шоколад 70 Кондитерский №1 А. Иванова
Пиво 50 Кондитерский №1 А. Иванова
Сахарный песок 100 Сладкая лавка Д. Петрова
Шоколад 70 Сладкая лавка Д. Петрова
Пиво 50 Сладкая лавка Д. Петрова

Заметьте, и тут нет дублей.

А что если перемножить какую то таблицу саму на себя? Например, таблицу 2 из нашего примера? Давайте, посмотрим:

Магазин1

Продавец1 Магазин2 Продавец2

Кондитерский №1

Кондитерский №1 А. Иванова А. Иванова
Сладкая лавка Кондитерский №1 Д. Петрова А. Иванова
Кондитерский №1 Сладкая лавка А. Иванова Д. Петрова
Сладкая лавка Сладкая лавка Д. Петрова Д. Петрова

Как видим, и тут не будет дублей, если их, конечно, нет в исходных таблицах.

Кстати, операция декартова произведения чем то напоминает full join в SQL.

Идем дальше.

Соединение. Операция соединения отношений A и B по предикату P логически эквивалентна последовательному применению операций декартового произведения A и B и выборки по предикату P. Если в отношениях имеются атрибуты с одинаковыми наименованиями, то перед выполнением соединения такие атрибуты необходимо переименовать. Обозначается как (A TIMES B) WHERE P.

Рассмотрим пример. Пусть у нас имеются два таблицы, в одной товары с ценами, в другой товары и их останки на склада:

Таблица 1.

Товар Цена
Сахарный песок 100
Шоколад 70
Пиво 50

Таблица 2.

Товар Остаток
Сахарный песок 4
Пиво 3

Применяя к ним операцию соединения, получаем по условию равенства товара (Таблица1 TIMES Таблица2) WHERE Таблица1.Товар=Таблица2.Товар:

Таблица1.Товар Таблица2.Товар Цена Остаток
Сахарный песок Сахарный песок 100 4
Шоколад Шоколад 70 -
Пиво Пиво 50 3

Данная операция похожа на left join из языка SQL.

Деление. Пожалуй, это сама сложная операция реляционной алгебры. По научному она формулируется так: Отношение с заголовком (X1, X2, …, Xn) и телом, содержащим множество кортежей (x1, x2, …, xn), таких, что для всех кортежей (y1, y2, …, ym) Î B в отношении A(X1, X2, …, Xn, Y1, Y2, …, Ym) найдется кортеж (x1, x2, …, xn, y1, y2, …, ym). Обозначается такая хитрая операция A DIVIDEBY B. По сути, деление в реляционной алгебре - это что-то обратное декартовому произведению.  Но не совсем. Что бы было более понятно, давайте рассмотрим пример. Пусть у нас имеется отношение R1 с заголовками A и B:

A B
S1 P1
S1 P2
S1 P3
S1 P4
S1 P5
S1 P6
S2 P1
S2 P2
S3 P2
S4 P2
S4 P4
S4 P5

и отношение R2 с заголовком B:

B
P2
P4

Тогда в результате деления останется вот такая таблица с заголовком A:

A
S1
S4

Как получился такой результат? Мы нашли в отношении R1 все строки, где имеются значения из отношения R2, они выделены желтым цветом.  Но в эти строки надо включить только те, которые образуют законченное декартово произведение. Давайте выделим отдельно эти найденные строки:

A B
S1 P2
S1 P4
S2 P2
S3 P2
S4 P2
S4 P4

Строки {S2, P2} и {S3,P2} выкидываем, потому что для них нет пары для второй стороны из отношения R2, то есть, нет кортежей {S2, P4} и {S3, P4}. А вот для кортежей {S1, P2} и {S1,P4} такая пара есть, это {S4,P2} и {S4,P4}. Поэтому эти строки оставляем, оставляем так же и их пары:

A B
S1 P2
S1 P4
S4 P2
S4 P4

Ну, и собственно, удаляем столбец B.

Последнее обновление ( 26.11.2023 г. )
 
Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги