Таблица 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 |
id | Дата_продажи | количество |
11 | 01.09.2009 | 20 |
56 | 01.09.2009 | 30 |
589 | 20.09.2009 | 50 |
o Внешнее соединение (Outerjoin).
Например, вывести все названия товаров и в скольких накладных они встречались, что бы не потерять те товары, которые ни разу не покупали.
id | наименование | количество |
11 | Макароны | 100 |
56 | Чипсы | 50 |
589 | Масло | 86 |
759 | оливки | 100 |
id | Дата_продажи | количество |
11 | 01.09.2009 | 20 |
56 | 01.09.2009 | 30 |
589 | 20.09.2009 | 50 |
589 | 21,09,2009 | 10 |
наименование | колич_продаж |
Макароны | 1 |
Чипсы | 1 |
Масло | 2 |
оливки | 0 |
o Самосоединение (Selfjoin). Самосоединение является эквисоединением таблицы с самой собой. Это также называется рекурсивным соединением.
Пример, который выводит список имен всех служащих и назначенных им руководителей.
ID | ФИО | ID_руководителя | Зарплата |
101 | Емельянов | 10000 | |
103 | Орлова | 101 | 8000 |
106 | Суханова | 101 | 8000 |
109 | Иванов | 106 | 5000 |
Подчиненный | Руководитель |
Орлова | Емельянов |
Суханова | Емельянов |
Иванов | Суханова |
o Агрегация (Aggregation). Цель агрегации состоит в том, чтобы предоставить для таблицы статистическую информацию, такую как сумма или среднее множества чисел.
· Пример скалярной агрегации (просто возвращает единственное значение как вывод), который не имеет какого-либо предложения GROUP BY:
|
|
· Синтаксис 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 |
· У операции реляционного деления два операнда - бинарное и унарное отношения. Результирующее отношение состоит из одноатрибутных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) совпадает со множеством значений второго операнда.
Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" - "какие поставщики поставляют все детали?".
Пример. В примере с поставщиками, деталями и поставками ответим на вопрос, "какие поставщики поставляют все детали?".
Номер поставщика 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 поставляет все детали.
· Операция переименования производит отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены.
Например, представим себе, что у отношений при их произведении имеются атрибуты с одинаковыми именами. Каким был бы заголовок результирующего отношения? Поскольку это множество, в нем не должны содержаться одинаковые элементы. Но и потерять атрибут в результате недопустимо. А это значит, что в этом случае вообще невозможно корректно выполнить операцию прямого произведения.
Аналогичные проблемы могут возникать и в случаях других операций. Для их разрешения в состав операций реляционной алгебры вводится операция переименования. Ее следует применять в любом случае, когда возникает конфликт именования атрибутов в отношениях при выполнении реляционной операции. Тогда к одному из отношений сначала применяется операция переименования, а затем основная операция выполняется уже безо всяких проблем.
· Операция присваивания позволяет сохранить результат вычисления реляционного выражения в существующем отношении БД.
Хотя в основе теоретико-множественной части реляционной алгебры и лежит классическая теория множеств, но соответствующие операции реляционной алгебры обладают некоторыми особенностями.
Некоторые реляционные операторы (например, объединение) требуют, чтобы отношения имели одинаковые заголовки. Действительно, отношения состоят из заголовка и тела. Операция объединения двух отношений есть просто объединение двух множеств кортежей, взятых из тел соответствующих отношений. Но будет ли результат отношением? Во-первых, если исходные отношения имеют разное количество атрибутов, то, очевидно, что множество, являющееся объединением таких разнотипных кортежей нельзя представить в виде отношения. Во-вторых, пусть даже отношения имеют одинаковое количество атрибутов, но атрибуты имеют различные наименования. Как тогда определить заголовок отношения, полученного в результате объединения множеств кортежей? В-третьих, пусть отношения имеют одинаковое количество атрибутов, атрибуты имеют одинаковые наименования, но определенны на различных доменах. Тогда снова объединение кортежей не будет образовывать отношение.
Будем называть отношения совместимыми по типу, если они имеют идентичные заголовки, а именно,
· Отношения имеют одно и то же множество имен атрибутов, т.е. для любого атрибута в одном отношении найдется атрибут с таким же наименованием в другом отношении,
· Атрибуты с одинаковыми именами определены на одних и тех же доменах.
Некоторые отношения не являются совместимыми по типу, но становятся таковыми после некоторого переименования атрибутов с помощью вспомогательного оператора переименования атрибутов.
Не все операторы реляционной алгебры являются независимыми - некоторые из них выражаются через другие реляционные операторы. Операторы соединения, пересечения и деления можно выразить через другие реляционные операторы, т.е. эти операторы не являются примитивными. Оставшиеся реляционные операторы (объединение, вычитание, декартово произведение, выборка, проекция) являются примитивными операторами - их нельзя выразить друг через друга.
Добавить ассоциативность и коммутативность операторов!!!!!!!!!!!!!!!!!!!!!!