Особенности теоретико-множественных операций реляционной алгебры

Таблица 6 Отношение X DEVIDEBY Y

Таблица 4 Отношение P JOIN PD JOIN D

Таблица 1 Отношение A

Таблица 3 Отношение A TIMES B

Таблица 3 Отношение A MINUS B

Таблица 2 Отношение B

Таблица 1 Отношение A

Таблица 3 Отношение A INTERSECT B

Таблица 2 Отношение B

Таблица 1 Отношение A

Таблица 3 Отношение A UNION B

Таблица 2 Отношение B

Таблица 1 Отношение A

Табельный номер Фамилия Зарплата
1 Иванов  
2 Пушников  
4 Сидоров  

Объединение отношений и будет иметь вид:

Табельный номер Фамилия Зарплата
  Иванов  
  Петров  
  Сидоров  
  Пушников  
  Сидоров  

Замечание. В объединении отношений и атрибут "Табельный номер" может содержать дубликаты значений.

Объединение отношений в SQL: (Select * from a) union (select * from b)

· Операция пересечения двух отношений производит отношение, включающее все кортежи, входящие в оба отношения.

Пример. Пусть даны два отношения и с информацией о сотрудниках:

Табельный номер Фамилия Зарплата
1 Иванов  
2 Петров  
3 Сидоров  
Табельный номер Фамилия Зарплата
1 Иванов  
2 Пушников  
4 Сидоров  

Для отношений и пересечение имеет вид:

Табельный номер Фамилия Зарплата
  Иванов  

Пересечение отношений в SQL: select a.* from a,b

where a.табельный_номер=b. табельный_номер

and a.фамилия=b. фамилия

and a.зарплата=b. зарплата

· Отношение, являющееся разностью двух отношений включает все кортежи, входящие в первое отношение, такие, что ни один из них не входит во второе отношение.

Пример. Пусть даны два отношения и с информацией о сотрудниках:

Табельный номер Фамилия Зарплата
1 Иванов  
2 Петров  
3 Сидоров  
Табельный номер Фамилия Зарплата
1 Иванов  
2 Пушников  
4 Сидоров  

Для отношений и вычитание имеет вид:

Табельный номер Фамилия Зарплата
2 Петров  
3 Сидоров  

Разность отношений в SQL: Select a.* from a where not exists

(select * from B

where a.табельный_номер=b. табельный_номер

and a.фамилия=b. фамилия

and a.зарплата=b. зарплата)

· При выполнении прямого произведения двух отношений производится отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов.

Пример. Пусть даны два отношения и с информацией о поставщиках и деталях:

Номер поставщика Наименование поставщика
1 Иванов
2 Петров
3 Сидоров

Таблица 1 Отношение A (Поставщики)

Номер детали Наименование детали
1 Болт
2 Гайка
3 Винт

Таблица 2 Отношение B (Детали)

Декартово произведение отношений и будет иметь вид:

Номер поставщика Наименование поставщика Номер детали Наименование детали
  Иванов   Болт
  Иванов   Гайка
  Иванов   Винт
  Петров   Болт
  Петров   Гайка
  Петров   Винт
  Сидоров   Болт
  Сидоров   Гайка
  Сидоров   Винт

Произведение отношений в SQL: Select a.*, b.* from a,b

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

Как мы увидим ниже, основной смысл включения операции расширенного прямого произведения в состав реляционной алгебры состоит в том, что на ее основе определяется действительно полезная операция соединения.

· Результатом ограничения отношения по некоторому условию является отношение, включающее кортежи отношения, удовлетворяющее этому условию.

Пример. Пусть дано отношение с информацией о сотрудниках:

Табельный номер Фамилия Зарплата
1 Иванов  
2 Петров  
3 Сидоров  

Результат выборки будет иметь вид:

Табельный номер Фамилия Зарплата
1 Иванов  
2 Петров  

Таблица 2 Отношение A WHERE Зарплата<3000

Ограничение отношения в SQL: Select * from A where a.Зарплата>3000

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

Замечание. Операция проекции дает " вертикальный срез " отношения, в котором удалены все возникшие при таком срезе дубликаты кортежей.

Пример. Пусть дано отношение с информацией о поставщиках, включающих наименование и месторасположение:

Номер поставщика Наименование поставщика Город поставщика
1 Иванов Уфа
2 Петров Москва
3 Сидоров Москва
4 Сидоров Челябинск

Таблица 1 Отношение A (Поставщики)

Проекция будет иметь вид:

Город поставщика
Уфа
Москва
Челябинск

Таблица 2 Отношение A[Город поставщика]

Проекция отношения в SQL: Select a.город_поставщика

from a

group by a. город_поставщика

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

Пример. Пусть имеются отношения , и , хранящие информацию о поставщиках, деталях и поставках соответственно (для удобства введем краткие наименования атрибутов):

Номер поставщика PNUM Наименование поставщика PNAME
1 Иванов
2 Петров
3 Сидоров

Таблица 1 Отношение P (Поставщики)

Номер детали DNUM Наименование детали DNAME
1 Болт
2 Гайка
3 Винт

Таблица 2 Отношение D (Детали)

Номер поставщика PNUM Номер детали DNUM Поставляемое количество VOLUME
1 1  
1 2  
1 3  
2 1  
2 2  
3 1  

Таблица 3 Отношение PD (Поставки)

Ответ на вопрос "какие детали поставляются поставщиками", более просто записывается в виде соединения трех отношений (для удобства просмотра порядок атрибутов изменен, это является допустимым по свойствам отношений):

Номер поставщика PNUM Наименование поставщика PNAME Номер детали DNUM Наименование детали DNAME Поставляемое количество VOLUME
  Иванов   Болт  
  Иванов   Гайка  
  Иванов   Винт  
  Петров   Болт  
  Петров   Гайка  
  Сидоров   Болт  

Естественное соединение в SQL: Select p.pnum, p.pname, d.dnum, d.dname, pd.volume

From p, d, pd

Where p.pnum=pd.pnum and d.dnum=pd.dnum

(SELECT p.pnum, p.pname, d.dnum, d.dname, pd.volume

FROM p, d, pd

WHERE p.pnum=pd.pnum and d.dnum=pd.dnum)

– естественное соединение или

SELECT p.pnum, p.pname, d.dnum, d.dname, pd.volume

FROM p INNER JOIN (d INNER JOIN pd ON d.dnum=pd.dnum) ON d.dnum=pd.dnum

A JOIN B = B JOIN A; (коммутативность)A JOIN (B JOIN C) = (A JOIN B) JOIN C; (ассоциативность)(A JOIN B) JOIN C = B JOIN (A JOIN C).

Виды соединения:

o Полусоединение (Semijoin). Т.е выбираются данные из одной таблицы из двух связанных

Примером могло бы быть множество всех продуктов, которые были проданы в течение сентября 2009 года:

id наименование количество
11 макароны 100
56 чипсы 50
589 масло 86
759 оливки 100
PRODUCT JR
id Дата_продажи количество
11 01.09.2009 20
56 01.09.2009 30
589 20.09.2009 50
ORDER SELECT P.id, P. наименование FROM PRODUCT P, ORDER O WHERE (O.id = P.id) AND (O. Дата_продажи BETWEEN 01.09.2009 AND 30.09.2009);Или SELECT P.id, P. наименование FROM PRODUCT P INNER JOIN ORDER O ON O.id = P.id WHERE O. Дата_продажи BETWEEN 01.09.2009 AND 30.09.2009;

o Внешнее соединение (Outerjoin).

Например, вывести все названия товаров и в скольких накладных они встречались, что бы не потерять те товары, которые ни разу не покупали.

id наименование количество
11 Макароны 100
56 Чипсы 50
589 Масло 86
759 оливки 100
PRODUCT JR
id Дата_продажи количество
11 01.09.2009 20
56 01.09.2009 30
589 20.09.2009 50
589 21,09,2009 10
ORDER
наименование колич_продаж
Макароны 1
Чипсы 1
Масло 2
оливки 0
SELECT P.наименование, COUNT(*) колич_продажFROM PRODUCT P, ORDER OWHERE P.id = O.id(+); SELECT P.наименование, COUNT(*) колич_продажFROM PRODUCT P LEFT JOIN ORDER O ON P.id = O.id;

o Самосоединение (Selfjoin). Самосоединение является эквисоединением таблицы с самой собой. Это также называется рекурсивным соединением.

Пример, который выводит список имен всех служащих и назначенных им руководителей.

ID ФИО ID_руководителя Зарплата
101 Емельянов   10000
103 Орлова 101 8000
106 Суханова 101 8000
109 Иванов 106 5000
EMPLOYEE SELECT E.ФИО Подчиненный, M.ФИО РуководительFROM EMPLOYEE E, EMPLOYEE MWHERE E.ID_руководителя = M. ID;
Подчиненный Руководитель
Орлова Емельянов
Суханова Емельянов
Иванов Суханова

o Агрегация (Aggregation). Цель агрегации состоит в том, чтобы предоставить для таблицы статистическую информацию, такую как сумма или среднее множества чисел.

· Пример скалярной агрегации (просто возвращает единственное значение как вывод), который не имеет какого-либо предложения GROUP BY:

SELECT SUM(ЗАРПЛАТА) FROM EMPLOYEE; SELECT COUNT(*)FROM EMPLOYEEWHERE ЗАРПЛАТА=8000;

· Синтаксис SQL для выполнения функции агрегации всегда включает предложение GROUP BY. В результате некоторая новая таблица:

ID ФИО ID_руководителя Зарплата ID_Отдела
101 Емельянов   10000 1026
103 Орлова 101 8000 205
106 Суханова 101 8000 205
109 Иванов 106 5000 63
ID_Отдела Зарплата
1026 10000
205 8000
63 5000
SELECT ID_Отдела, AVG(зарплата)FROM EMPLOYEEGROUP BY ID_Отдела;

· У операции реляционного деления два операнда - бинарное и унарное отношения. Результирующее отношение состоит из одноатрибутных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) совпадает со множеством значений второго операнда.

Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" - "какие поставщики поставляют все детали?".

Пример. В примере с поставщиками, деталями и поставками ответим на вопрос, "какие поставщики поставляют все детали?".

Номер поставщика PNUM Номер детали DNUM Поставляемое количество VOLUME
1 1  
1 2  
1 3  
2 1  
2 2  
3 1  

Таблица 3 отношение PD (Поставки)

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

Номер поставщика PNUM Номер детали DNUM
   
   
   
   
   
   

Таблица 4 Проекция X=PD[PNUM,DNUM]

Проекция в SQL: Select pnum,dnum from pd

В качестве делителя возьмем проекцию, содержащую список номеров всех деталей (не обязательно поставляемых кем-либо):

Номер детали DNUM
 
 
 

Таблица 5 Проекция Y=D[DNUM]

Проекция в SQL: Select dnum from pd group by dnum

Деление дает список номеров поставщиков, поставляющих все детали:

Номер поставщика PNUM
 

Оказалось, что только поставщик с номером 1 поставляет все детали.

· Операция переименования производит отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены.

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

Аналогичные проблемы могут возникать и в случаях других операций. Для их разрешения в состав операций реляционной алгебры вводится операция переименования. Ее следует применять в любом случае, когда возникает конфликт именования атрибутов в отношениях при выполнении реляционной операции. Тогда к одному из отношений сначала применяется операция переименования, а затем основная операция выполняется уже безо всяких проблем.

· Операция присваивания позволяет сохранить результат вычисления реляционного выражения в существующем отношении БД.

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

Некоторые реляционные операторы (например, объединение) требуют, чтобы отношения имели одинаковые заголовки. Действительно, отношения состоят из заголовка и тела. Операция объединения двух отношений есть просто объединение двух множеств кортежей, взятых из тел соответствующих отношений. Но будет ли результат отношением? Во-первых, если исходные отношения имеют разное количество атрибутов, то, очевидно, что множество, являющееся объединением таких разнотипных кортежей нельзя представить в виде отношения. Во-вторых, пусть даже отношения имеют одинаковое количество атрибутов, но атрибуты имеют различные наименования. Как тогда определить заголовок отношения, полученного в результате объединения множеств кортежей? В-третьих, пусть отношения имеют одинаковое количество атрибутов, атрибуты имеют одинаковые наименования, но определенны на различных доменах. Тогда снова объединение кортежей не будет образовывать отношение.

Будем называть отношения совместимыми по типу, если они имеют идентичные заголовки, а именно,

· Отношения имеют одно и то же множество имен атрибутов, т.е. для любого атрибута в одном отношении найдется атрибут с таким же наименованием в другом отношении,

· Атрибуты с одинаковыми именами определены на одних и тех же доменах.

Некоторые отношения не являются совместимыми по типу, но становятся таковыми после некоторого переименования атрибутов с помощью вспомогательного оператора переименования атрибутов.

Не все операторы реляционной алгебры являются независимыми - некоторые из них выражаются через другие реляционные операторы. Операторы соединения, пересечения и деления можно выразить через другие реляционные операторы, т.е. эти операторы не являются примитивными. Оставшиеся реляционные операторы (объединение, вычитание, декартово произведение, выборка, проекция) являются примитивными операторами - их нельзя выразить друг через друга.

Добавить ассоциативность и коммутативность операторов!!!!!!!!!!!!!!!!!!!!!!


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: