Изменения

Перейти к: навигация, поиск

Реляционная алгебра: соединения, деление

16 321 байт добавлено, 18:57, 14 декабря 2021
Соединения
==Естественное соединение==
{{Определение|definition='''TODOЕстественным соединением'''(англ. ''Natural join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а тело состоит из кортежей, полученных всевозможными соединениями кортежей <tex>R_1</tex> и <tex>R_2</tex>, имеющих равные значения одноимённых атрибутов. Обозначение: <tex>R_1 \Join R_2</tex>}}===Пример=== Рассмотрим два отношения:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|2|Пётр|-|3|Сидор|}{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''LastName'''|-|1|Иванов|-|1|Петров|-|2|Сидоров|}Их естественным соединением будет следующее отношение:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''!'''LastName'''|-|1|Иван|Иванов|-|1|Иван|Петров|-|2|Пётр|Сидоров|} ===Свойства=== ''Замечание.'' Здесь и далее под теоретико-множественными операциями над отношениями (мощность отношения, включение одного отношения в другое и т.д.) будем иметь ввиду соответствующие операции над телами отношений. * Если <tex>|R_1| = m</tex> и <tex>|R_2| = n</tex>, то <tex>0 \leq |R_1 \Join R_2| \leq mn</tex>.** <tex>|R_1 \Join R_2| = 0</tex> достигается, если у общих атрибутов в <tex>R_1</tex> и <tex>R_2</tex> нет равных значений** <tex>|R_1 \Join R_2| = mn</tex> достигается, в частности, при отсутствии общих атрибутов у <tex>R_1</tex> и <tex>R_2</tex> (в такой ситуации естественное соединение совпадает с полным: <tex>R_1 \Join R_2 = R_1 \times R_2</tex>)
==Внешние соединения==
{{Определение|definition='''TODOЛевым соединением'''(англ. ''Left join'' или ''Left outer join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а тело состоит из кортежей, полученных всевозможными соединениями кортежей <tex>R_1</tex> и <tex>R_2</tex>, имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из <tex>R_1</tex> не соответствует ни одного кортежа из <tex>R_2</tex>, то в результат добавляется этот кортеж из <tex>R_1</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟕ \, R_2</tex>}}{{Определение|definition='''Правым соединением''' (англ. ''Right join'' или ''Right outer join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а тело состоит из кортежей, полученных всевозможными соединениями кортежей <tex>R_1</tex> и <tex>R_2</tex>, имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из <tex>R_2</tex> не соответствует ни одного кортежа из <tex>R_1</tex>, то в результат добавляется этот кортеж из <tex>R_2</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟖ \, R_2</tex>}}{{Определение|definition='''Внешним соединением''' (англ. ''Outer join'' или ''Full outer join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а тело состоит из кортежей, полученных всевозможными соединениями кортежей <tex>R_1</tex> и <tex>R_2</tex>, имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из одного отношения не соответствует ни одного кортежа из другого, то в результат добавляется этот кортеж, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟗ \, R_2</tex>}}===Пример=== Рассмотрим два отношения (<tex>R_1</tex> и <tex>R_2</tex> соответственно):{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|2|Пётр|-|3|Сидор|}{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''LastName'''|-|1|Иванов|-|1|Петров|-|3|Сидоров|-|4|Плюшкин|}Тогда <tex>R_1 \, ⟕ \, R_2</tex> (левое соединение) равно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''!'''LastName'''|-|1|Иван|Иванов|-|1|Иван|Петров|-|2|Пётр||-|3|Сидор|Сидоров|}<tex>R_1 \, ⟖ \, R_2</tex> (правое соединение) равно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''!'''LastName'''|-|1|Иван|Иванов|-|1|Иван|Петров|-|3|Сидор|Сидоров|-|4||Плюшкин|}<tex>R_1 \, ⟗ \, R_2</tex> (внешнее соединение) равно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''!'''LastName'''|-|1|Иван|Иванов|-|1|Иван|Петров|-|2|Пётр||-|3|Сидор|Сидоров|-|4||Плюшкин|} ===Свойства=== Непосредственно из определений вытекают следующие свойства: * <tex>R_1 \, ⟕ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus \pi_{R_1}(R_1 \Join R_2))</tex>* <tex>R_1 \, ⟖ \, R_2 = (R_1 \Join R_2) \cup (R_2 \setminus \pi_{R_2}(R_1 \Join R_2))</tex>* <tex>R_1 \, ⟗ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus \pi_{R_1}(R_1 \Join R_2)) \cup (R_2 \setminus \pi_{R_2}(R_1 \Join R_2))</tex> Из этих свойств, в свою очередь, следует: * <tex>R_1 \, ⟕ \, R_2 = R_2 \, ⟖ \, R_1</tex>* <tex>R_1 \, ⟗ \, R_2 = (R_1 \, ⟕ \, R_2) \cup (R_1 \, ⟖ \, R_2)</tex>
==Полусоединения==
{{Определение|definition='''TODOЛевым полусоединением'''(англ. ''Left semijoin'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок равен заголовку <tex>R_1</tex>, а тело состоит из кортежей в <tex>R_1</tex>, для которых существует кортеж из <tex>R_2</tex> с равными значениями одноимённых атрибутов. Обозначение: <tex>R_1 \ltimes R_2</tex>}}{{Определение|definition='''Правым полусоединением''' (англ. ''Right semijoin'') двух отношений <tex>R_1</tex> и <tex>R_2</tex> называется отношение, в котором заголовок равен заголовку <tex>R_2</tex>, а тело состоит из кортежей в <tex>R_2</tex>, для которых существует кортеж из <tex>R_1</tex> с равными значениями одноимённых атрибутов. Обозначение: <tex>R_1 \rtimes R_2</tex>}}===Пример=== Рассмотрим два отношения (<tex>R_1</tex> и <tex>R_2</tex> соответственно):{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|2|Пётр|-|3|Сидор|}{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''LastName'''|-|1|Иванов|-|1|Петров|-|3|Сидоров|-|4|Плюшкин|}Тогда <tex>R_1 \ltimes R_2</tex> (левое полусоединение) равно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|3|Сидор|}<tex>R_1 \rtimes R_2</tex> (правое полусоединение) равно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''LastName'''|-|1|Иванов|-|1|Петров|-|3|Сидоров|} ===Свойства=== Из определения следует: * <tex>R_1 \ltimes R_2 = \pi_{R_1}(R_1 \Join R_2)</tex>* <tex>R_1 \rtimes R_2 = \pi_{R_2}(R_1 \Join R_2)</tex>* <tex>R_1 \ltimes R_2 = R_2 \rtimes R_1</tex> Из соответствующих свойств внешних соединений следует: * <tex>R_1 \, ⟕ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus (R_1 \ltimes R_2))</tex>* <tex>R_1 \, ⟖ \, R_2 = (R_1 \Join R_2) \cup (R_2 \setminus (R_1 \rtimes R_2))</tex>* <tex>R_1 \, ⟗ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus (R_1 \ltimes R_2)) \cup (R_2 \setminus (R_1 \rtimes R_2))</tex>
==Условные соединения==
 
{{Определение
|definition=
'''Условным соединением''' (англ. ''Conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Обозначение: <tex>R_1 \times_{\theta} R_2</tex>
}}
{{Определение
|definition=
'''Левым условным соединением''' (англ. ''Left conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из <tex>R_1</tex> не соответствует ни одного кортежа из <tex>R_2</tex>, то в результат добавляется этот кортеж из <tex>R_1</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 ⟕_{\theta} R_2</tex>
}}
{{Определение
|definition=
'''Правым условным соединением''' (англ. ''Right conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из <tex>R_2</tex> не соответствует ни одного кортежа из <tex>R_1</tex>, то в результат добавляется этот кортеж из <tex>R_2</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 ⟖_{\theta} R_2</tex>
}}
{{Определение
|definition=
'''Внешним условным соединением''' (англ. ''Outer conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из одного отношения не соответствует ни одного кортежа из другого, то в результат добавляется этот кортеж, дополненный пустыми значениями. Обозначение: <tex>R_1 ⟗_{\theta} R_2</tex>
}}
===Пример===
 
Рассмотрим два отношения (<tex>R_1</tex> и <tex>R_2</tex> соответственно):
{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"
!'''Id1'''
!'''FirstName'''
|-
|1
|Иван
|-
|2
|Пётр
|-
|3
|Сидор
|}
{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"
!'''Id2'''
!'''LastName'''
|-
|1
|Иванов
|-
|1
|Петров
|-
|3
|Сидоров
|-
|4
|Плюшкин
|}
Тогда <tex>R_1 ⟕_{\text{length(FirstName)}+2<\text{length(LastName)}} R_2</tex> равно:
{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"
!'''Id1'''
!'''FirstName'''
!'''Id2'''
!'''LastName'''
|-
|1
|Иван
|3
|Сидоров
|-
|1
|Иван
|4
|Плюшкин
|-
|2
|Пётр
|3
|Сидоров
|-
|2
|Пётр
|4
|Плюшкин
|-
|3
|Сидор
|
|
|}
 
===Свойства===
 
Из определений следует:
 
* <tex>R_1 \times_{\theta} R_2 = \sigma_{\theta}(R_1 \times R_2)</tex>
* <tex>R_1 ⟕_{\theta} R_2 = J \cup (R_1 \setminus \pi_{R_1}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>
* <tex>R_1 ⟖_{\theta} R_2 = J \cup (R_2 \setminus \pi_{R_2}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>
* <tex>R_1 ⟗_{\theta} R_2 = J \cup (R_1 \setminus \pi_{R_1}(J)) \cup (R_2 \setminus \pi_{R_2}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>
 
Из свойств выше нетрудно вывести:
 
* <tex>R_1 ⟕_{\theta} R_2 = R_2 ⟖_{\theta} R_1</tex>
* <tex>R_1 ⟗_{\theta} R_2 = (R_1 ⟕_{\theta} R_2) \cup (R_1 ⟖_{\theta} R_2)</tex>
 
=Деление=
 
==Деление==
'''TODO'''
=Деление=Большое деление==
'''TODO'''
 
=Литература=
* ''Дейт К.'' Введение в системы баз данных (глава 7)
* ''Уидом Д., Ульман Д.'' Основы реляционных баз данных (главы 4 и 5)
 
[[Категория: Базы данных]]
9
правок

Навигация