РЕЛЯЦИОННАЯ АЛГЕБРА РЕЛЯЦИОННАЯ МОДЕЛЬ ДАННЫХ Реляционная модель данных – самая распространенная из существующих сейчас моделей данных, основана на понятии таблицы (relation), эту модель предложил в 1970 г. Э.Ф.Кодд. Реляционная алгебра (РА). РА представляет собой математический аппарат для работы с объектами-таблицами. Кроме РА, существуют также теории реляционного исчисления на доменах и реляционного исчисления на кортежах, эквивалентные теории РА. РЕЛЯЦИОННАЯ АЛГЕБРА Операндами и результатами операций в РА являются таблицы. Схема таблицы – список столбцов таблицы с их именами и типами. Пример реляционной модели “Поставка деталей” (подчеркнуты ключевые поля): ДЕТАЛЬ ПОСТАВЩИК КЛИЕНТ ПОСТАВКА (ДИмя, ДНомер, ДМодель, ДЦена) (ПИмя, ПНомер, Город) (КИмя, КНомер, Город) (ДНомер, ПНомер, КНомер, Дата, Колво) УНАРНЫЕ ОПЕРАЦИИ: ПРОЕКЦИЯ proj список_полей (Таблица) Выполняется в два этапа: сначала выбираются нужные столбцы, затем вычеркиваются повторяющиеся строки. Пример: найти все названия поставщиков и города, в которых они находятся proj ПИмя, Город (ПОСТАВЩИК) УНАРНЫЕ ОПЕРАЦИИ: ВЫБОР sel условие (Таблица) Из таблицы выбираются только те строки, которые отвечают заданному условию. Для формирования сложных условий используются логические связки AND, OR, NOT. Строкиконстанты задаются в кавычках. Схема таблицы-результата совпадает со схемой исходной таблицы. Пример: найти все детали модели МС550: sel ДМодель=”МС550”(ДЕТАЛЬ) БИНАРНЫЕ ОПЕРАЦИИ: СОЕДИНЕНИЕ Таблица1 join Таблица2 Для того чтобы результат существовал, нужно, чтобы операнды имели одноименные поля. В схему таблицы-результата входят все поля из обеих таблиц, одноименные поля входят только один раз. Операция выполняется по следующим правилам: каждая строка первой таблицы соединяется с каждой строкой второй таблицы, если они имеют одинаковые значения в одноименных полях. Соединение может выполняться по одному полю или по нескольким полям. БИНАРНЫЕ ОПЕРАЦИИ: СОЕДИНЕНИЕ Пример: напечатать, какие детали и когда поставлялись – названия деталей и даты поставок. proj ДИмя, Дата (ПОСТАВКА join ДЕТАЛЬ) Пример: напечатать, какие детали и куда поставлялись – названия деталей и города клиентов. proj ДИмя, Город (КЛИЕНТ join ПОСТАВКА join ДЕТАЛЬ) БИНАРНЫЕ ОПЕРАЦИИ: СОЕДИНЕНИЕ Пример: напечатать имена Поставщиков и их Клиентов (т.е., Поставщик связан с Клиентом через Поставку). proj ПИмя, КИмя ( proj ПНомер, ПИмя(ПОСТАВЩИК) join ПОСТАВКА join proj КНомер, КИмя(КЛИЕНТ) ) Пример: напечатать всевозможные пары Поставщик-Клиент, находящиеся в одном городе (не обязательно связанные поставками). proj ПИмя, КИмя (ПОСТАВЩИК join КЛИЕНТ) ОБЪЕДИНЕНИЕ, ПЕРЕСЕЧЕНИЕ, ВЫЧИТАНИЕ Следующие три операции аналогичны операциям над множествами. Поскольку в РА операндами являются таблицы, требуется, чтобы схемы обоих операндов были одинаковыми. Таблицы-результаты имеют те же схемы, что и операнды. БИНАРНЫЕ ОПЕРАЦИИ: ОБЪЕДИНЕНИЕ Таблица1 union Таблица2 Строка попадает в результирующую таблицу, если она присутствует или в первом, или во втором операнде. Дубликаты в результат не включаются. Пример: напечатать названия городов, в которых есть либо Поставщик, либо Клиент (хотя бы один). proj Город (ПОСТАВЩИК) union proj Город (КЛИЕНТ) БИНАРНЫЕ ОПЕРАЦИИ: ПЕРЕСЕЧЕНИЕ Таблица1 intersection Таблица2 Строка попадает в результирующую таблицу, если она присутствует как в первом, так и во втором операнде. Пример: напечатать названия городов, в которых есть и Поставщик, и Клиент. proj Город (ПОСТАВЩИК) intersection proj Город (КЛИЕНТ) БИНАРНЫЕ ОПЕРАЦИИ: ВЫЧИТАНИЕ Таблица1 difference Таблица2 Строка попадает в результирующую таблицу, если она присутствует в первом, но не присутствует во втором операнде. Пример: напечатать названия городов, в которых есть Поставщики, но нет Клиентов. proj Город (ПОСТАВЩИК) difference proj Город (КЛИЕНТ) ОБЪЕДИНЕНИЕ, ПЕРЕСЕЧЕНИЕ И ВЫЧИТАНИЕ Пример: напечатать названия городов, в которых есть или Поставщик, или Клиент, но не оба одновременно. (proj Город (ПОСТАВЩИК) union proj Город (КЛИЕНТ) ) difference (proj Город (ПОСТАВЩИК) intersection proj Город (КЛИЕНТ) ) БИНАРНЫЕ ОПЕРАЦИИ: ДЕЛЕНИЕ Таблица1 division Таблица2 Для применения этой операции требуется, чтобы схема второго операнда была подмножеством схемы первого операнда. В схему результата попадают столбцы первой таблицы, которых нет во второй таблице. Результат формируется следующим образом: строка попадает в результат, если в первой таблице она сцеплена со всеми строками второй таблицы. БИНАРНЫЕ ОПЕРАЦИИ: ДЕЛЕНИЕ Таблица2 Таблица1 F1 F2 F3 F1 A 1 z A B 1 z B C 1 z A 2 d B 2 d A 5 q C 5 q C Таблица1 division Таблица2 F2 F3 1 z БИНАРНЫЕ ОПЕРАЦИИ: ДЕЛЕНИЕ Пример: получить номера Поставщиков, которые выполняли поставки всем Клиентам из Москвы. proj ПНомер, КНомер (ПОСТАВКА) division proj КНомер (sel Город= «Москва»(КЛИЕНТ)) БИНАРНЫЕ ОПЕРАЦИИ: УМНОЖЕНИЕ (ДЕКАРТОВО ПРОИЗВЕДЕНИЕ) Таблица1 product Таблица2 В схему результирующей таблицы входят все поля обоих операндов. Поскольку имена полей могут совпадать, используются составные имена полей: Имя_таблицы.Имя_поля. Результат формируется следующим образом: каждая строка первой таблицы сцепляется с каждой строкой второй таблицы. Пример: получить всевозможные пары Поставщик-Клиент. proj ПОСТАВЩИК.ПИмя, КЛИЕНТ.КИмя (ПОСТАВЩИК product КЛИЕНТ) ПРИМЕР ER-МОДЕЛИ: «МУЗЫКАНТЫ» ПРИМЕР РЕЛЯЦИОННОЙ МОДЕЛИ: «МУЗЫКАНТЫ» Музыканты (НомМуз, ИмяМуз, ДатаРожд, СтрРожд) Сочинения (НомСоч, НазСоч, ДатаСоч, НомМуз) Столбец НомМуз представляет собой ссылку на таблицу «Музыканты» и содержит номера музыкантов- композиторов. Исполнители (НомИсп, Инструмент, Оценка, НомМуз) Столбец НомМуз представляет собой ссылку на таблицу «Музыканты». Ансамбли (НомАнс, НазАнс, СтрАнс, НомМуз) Столбец НомМуз представляет собой ссылку на таблицу «Музыканты» и содержит номера музыкантов-руководителей ансамблей. УчастникиАнсамблей(НомАнс, НомИсп) Эта таблица содержит ссылки на таблицы «Ансамбли» и «Исполнители». Исполнения (НомМуз, НомАнс, НомСоч, ДатаИсп, СтрИсп, ГорИсп) Таблица имеет составной первичный ключ, а также ссылки на таблицы «Сочинения», «Музыканты» (имеются в виду дирижеры) и «Ансамбли». ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ»: Получить имена музыкантов, которые играют или на кларнете, или на барабане. Получить имена музыкантов, которые играют и на кларнете, и на барабане. Получить имена музыкантов, которые играют на кларнете, но не играют на барабане. Получить имена музыкантов, которые играют или на кларнете, или на барабане, но не на обоих инструментах. Получить имена музыкантов, которые не играют ни на каких инструментах. Получить имена музыкантов, которые играют только на кларнете. Получить имена музыкантов, которые играют на всех инструментах, упомянутых в таблице «Исполнители» . Получить названия ансамблей, которые исполняли Моцарта на саксофоне. ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 1 Получить имена музыкантов, которые играют или на кларнете, или на барабане. 1)proj ИмяМуз ( proj НомМуз ( sel Инструмент=«Кларнет» (Исполнители)) union proj НомМуз ( sel Инструмент=«Барабан» (Исполнители)) join Музыканты) 2)proj ИмяМуз (Музыканты join sel Инструмент=«Кларнет» OR Инструмент=«Барабан»(Исполнители)) Proj ИмяМуз Join Union Proj НомМуз Sel Инструмент =«Кларнет» Исполнители Музыканты Proj НомМуз Sel Инструмент =«Барабан» Исполнители ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 2 Получить имена музыкантов, которые играют и на кларнете, и на барабане. proj ИмяМуз ( proj НомМуз ( sel Инструмент=«Кларнет» (Исполнители)) intersection proj НомМуз ( sel Инструмент=«Барабан» (Исполнители)) join Музыканты) ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 3 Получить имена музыкантов, которые играют на кларнете, но не играют на барабане. proj ИмяМуз ( proj НомМуз ( sel Инструмент=«Кларнет» (Исполнители)) difference proj НомМуз ( sel Инструмент=«Барабан» (Исполнители)) join Музыканты) ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 4 Получить имена музыкантов, которые играют или на кларнете, или на барабане, но не на обоих инструментах. proj ИмяМуз (Музыканты join ( (proj НомМуз (sel Инструмент=«Кларнет» (Исполнители)) union proj НомМуз (sel Инструмент=«Барабан» (Исполнители))) difference (proj НомМуз (sel Инструмент=«Кларнет» (Исполнители)) intersection proj НомМуз (sel Инструмент=«Барабан» (Исполнители))) ) ) Proj ИмяМуз Join Difference Proj НомМуз Sel Инструмент =«Кларнет» OR Инструмент =«Барабан» Исполнители Музыканты Intersection Proj НомМуз Proj НомМуз Sel Инструмент =«Кларнет» Исполнители Sel Инструмент =«Барабан» Исполнители ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 5 Получить имена музыкантов, которые не играют ни на каких инструментах. proj ИмяМуз (Музыканты join (proj НомМуз (Музыканты) difference proj НомМуз (Исполнители)) Proj ИмяМуз Join Difference Proj НомМуз Музыканты Музыканты Proj НомМуз Исполнители ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 6 Получить имена музыкантов, которые играют только на кларнете. proj ИмяМуз (Музыканты join (proj НомМуз (Исполнители) difference proj НомМуз sel Инструмент!=«Кларнет» (Исполнители) ) Proj ИмяМуз Join Difference Proj НомМуз Исполнители Музыканты Proj НомМуз Sel Инструмент =«Кларнет» Исполнители ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 7 Получить имена музыкантов, которые играют на всех инструментах, упомянутых в таблице «Исполнители» . proj ИмяМуз (Музыканты join (proj НомМуз, Инструмент (Исполнители) division proj Инструмент (Исполнители) ) Proj ИмяМуз Join Division Proj НомМуз, Инструмент Исполнители Музыканты Proj Инструмент Исполнители ЗАДАНИЯ ПО МОДЕЛИ «МУЗЫКАНТЫ» 8 Получить названия ансамблей, которые исполняли Моцарта на саксофоне. proj(11) НазАнс ( proj(3) НомСоч (Сочинения join(2) sel(1) ИмяМуз='Моцарт' (Музыканты)) join(9) proj(8) НомСоч, НомАнс (proj(5) НомИсп (sel(4) Инструмент ='Саксофон' (Исполнители)) join(6) УчАнс join(7) Исполнения) join(10) Ансамбли) Proj НазАнс Join Join Proj НомСоч Ансамбли Proj НомСоч,НомАнс Join Sel ИмяМуз =«Моцарт» Join Сочинения Join Proj НомИсп Музыканты Исполнения УчАнс Sel Инструмент =«Саксофон» Исполнители