Реляционная алгебра: соединения, деление — различия между версиями
Masmirnov (обсуждение | вклад) (Структура страницы; полное соединение) |
Masmirnov (обсуждение | вклад) (Соединения) |
||
| Строка 97: | Строка 97: | ||
==Естественное соединение== | ==Естественное соединение== | ||
| − | ''' | + | {{Определение |
| + | |definition= | ||
| + | '''Естественным соединением''' (англ. ''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= | ||
| + | '''Левым соединением''' (англ. ''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= | ||
| + | '''Левым полусоединением''' (англ. ''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''' | ||
| − | = | + | ==Большое деление== |
'''TODO''' | '''TODO''' | ||
| + | |||
| + | =Литература= | ||
| + | * ''Дейт К.'' Введение в системы баз данных (глава 7) | ||
| + | * ''Уидом Д., Ульман Д.'' Основы реляционных баз данных (главы 4 и 5) | ||
| + | |||
| + | [[Категория: Базы данных]] | ||
Версия 18:57, 14 декабря 2021
Содержание
Соединения
| Определение: |
| Соединение (англ. Join) — общее наименование для бинарных операторов на отношениях, позволяющих некоторым образом соединить данные из нескольких отношений в одно. |
Полное соединение
| Определение: |
| Полным, или декартовым соединением (англ. Cross join, Cartesian join) двух отношений и , у которых нет общих атрибутов, называется отношение, в котором заголовок является объединением заголовков и , а тело — декартовым произведением тел и . Обозначение: |
В случае, если у двух отношений есть хотя бы один общий атрибут в заголовке, их полное соединение не определено.
Пример
Рассмотрим два отношения:
| Id1 | FirstName |
|---|---|
| 1 | Иван |
| 2 | Пётр |
| 3 | Сидор |
| Id2 | LastName |
|---|---|
| 1 | Иванов |
| 3 | Петров |
| 4 | Сидоров |
Их полным соединением будет следующее отношение:
| Id1 | FirstName | Id2 | LastName |
|---|---|---|---|
| 1 | Иван | 1 | Иванов |
| 1 | Иван | 3 | Петров |
| 1 | Иван | 4 | Сидоров |
| 2 | Пётр | 1 | Иванов |
| 2 | Пётр | 3 | Петров |
| 2 | Пётр | 4 | Сидоров |
| 3 | Сидор | 1 | Иванов |
| 3 | Сидор | 3 | Петров |
| 3 | Сидор | 4 | Сидоров |
Естественное соединение
| Определение: |
| Естественным соединением (англ. Natural join) двух отношений и называется отношение, в котором заголовок является объединением заголовков и , а тело состоит из кортежей, полученных всевозможными соединениями кортежей и , имеющих равные значения одноимённых атрибутов. Обозначение: |
Пример
Рассмотрим два отношения:
| Id | FirstName |
|---|---|
| 1 | Иван |
| 2 | Пётр |
| 3 | Сидор |
| Id | LastName |
|---|---|
| 1 | Иванов |
| 1 | Петров |
| 2 | Сидоров |
Их естественным соединением будет следующее отношение:
| Id | FirstName | LastName |
|---|---|---|
| 1 | Иван | Иванов |
| 1 | Иван | Петров |
| 2 | Пётр | Сидоров |
Свойства
Замечание. Здесь и далее под теоретико-множественными операциями над отношениями (мощность отношения, включение одного отношения в другое и т.д.) будем иметь ввиду соответствующие операции над телами отношений.
- Если и , то .
- достигается, если у общих атрибутов в и нет равных значений
- достигается, в частности, при отсутствии общих атрибутов у и (в такой ситуации естественное соединение совпадает с полным: )
Внешние соединения
| Определение: |
| Левым соединением (англ. Left join или Left outer join) двух отношений и называется отношение, в котором заголовок является объединением заголовков и , а тело состоит из кортежей, полученных всевозможными соединениями кортежей и , имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из не соответствует ни одного кортежа из , то в результат добавляется этот кортеж из , дополненный пустыми значениями. Обозначение: |
| Определение: |
| Правым соединением (англ. Right join или Right outer join) двух отношений и называется отношение, в котором заголовок является объединением заголовков и , а тело состоит из кортежей, полученных всевозможными соединениями кортежей и , имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из не соответствует ни одного кортежа из , то в результат добавляется этот кортеж из , дополненный пустыми значениями. Обозначение: |
| Определение: |
| Внешним соединением (англ. Outer join или Full outer join) двух отношений и называется отношение, в котором заголовок является объединением заголовков и , а тело состоит из кортежей, полученных всевозможными соединениями кортежей и , имеющих равные значения одноимённых атрибутов. Если по одноимённым атрибутам кортежу из одного отношения не соответствует ни одного кортежа из другого, то в результат добавляется этот кортеж, дополненный пустыми значениями. Обозначение: |
Пример
Рассмотрим два отношения ( и соответственно):
| Id | FirstName |
|---|---|
| 1 | Иван |
| 2 | Пётр |
| 3 | Сидор |
| Id | LastName |
|---|---|
| 1 | Иванов |
| 1 | Петров |
| 3 | Сидоров |
| 4 | Плюшкин |
Тогда (левое соединение) равно:
| Id | FirstName | LastName |
|---|---|---|
| 1 | Иван | Иванов |
| 1 | Иван | Петров |
| 2 | Пётр | |
| 3 | Сидор | Сидоров |
(правое соединение) равно:
| Id | FirstName | LastName |
|---|---|---|
| 1 | Иван | Иванов |
| 1 | Иван | Петров |
| 3 | Сидор | Сидоров |
| 4 | Плюшкин |
(внешнее соединение) равно:
| Id | FirstName | LastName |
|---|---|---|
| 1 | Иван | Иванов |
| 1 | Иван | Петров |
| 2 | Пётр | |
| 3 | Сидор | Сидоров |
| 4 | Плюшкин |
Свойства
Непосредственно из определений вытекают следующие свойства:
Из этих свойств, в свою очередь, следует:
Полусоединения
| Определение: |
| Левым полусоединением (англ. Left semijoin) двух отношений и называется отношение, в котором заголовок равен заголовку , а тело состоит из кортежей в , для которых существует кортеж из с равными значениями одноимённых атрибутов. Обозначение: |
| Определение: |
| Правым полусоединением (англ. Right semijoin) двух отношений и называется отношение, в котором заголовок равен заголовку , а тело состоит из кортежей в , для которых существует кортеж из с равными значениями одноимённых атрибутов. Обозначение: |
Пример
Рассмотрим два отношения ( и соответственно):
| Id | FirstName |
|---|---|
| 1 | Иван |
| 2 | Пётр |
| 3 | Сидор |
| Id | LastName |
|---|---|
| 1 | Иванов |
| 1 | Петров |
| 3 | Сидоров |
| 4 | Плюшкин |
Тогда (левое полусоединение) равно:
| Id | FirstName |
|---|---|
| 1 | Иван |
| 3 | Сидор |
(правое полусоединение) равно:
| Id | LastName |
|---|---|
| 1 | Иванов |
| 1 | Петров |
| 3 | Сидоров |
Свойства
Из определения следует:
Из соответствующих свойств внешних соединений следует:
Условные соединения
| Определение: |
| Условным соединением (англ. Conditional join) двух отношений и , у которых нет общих атрибутов, по условию называется отношение, в котором заголовок является объединением заголовков и , а кортежами тела являются всевозможные конкатенации кортежей тел и , удовлетворяющих условию . Обозначение: |
| Определение: |
| Левым условным соединением (англ. Left conditional join) двух отношений и , у которых нет общих атрибутов, по условию называется отношение, в котором заголовок является объединением заголовков и , а кортежами тела являются всевозможные конкатенации кортежей тел и , удовлетворяющих условию . Если в результате кортежу из не соответствует ни одного кортежа из , то в результат добавляется этот кортеж из , дополненный пустыми значениями. Обозначение: |
| Определение: |
| Правым условным соединением (англ. Right conditional join) двух отношений и , у которых нет общих атрибутов, по условию называется отношение, в котором заголовок является объединением заголовков и , а кортежами тела являются всевозможные конкатенации кортежей тел и , удовлетворяющих условию . Если в результате кортежу из не соответствует ни одного кортежа из , то в результат добавляется этот кортеж из , дополненный пустыми значениями. Обозначение: |
| Определение: |
| Внешним условным соединением (англ. Outer conditional join) двух отношений и , у которых нет общих атрибутов, по условию называется отношение, в котором заголовок является объединением заголовков и , а кортежами тела являются всевозможные конкатенации кортежей тел и , удовлетворяющих условию . Если в результате кортежу из одного отношения не соответствует ни одного кортежа из другого, то в результат добавляется этот кортеж, дополненный пустыми значениями. Обозначение: |
Пример
Рассмотрим два отношения ( и соответственно):
| Id1 | FirstName |
|---|---|
| 1 | Иван |
| 2 | Пётр |
| 3 | Сидор |
| Id2 | LastName |
|---|---|
| 1 | Иванов |
| 1 | Петров |
| 3 | Сидоров |
| 4 | Плюшкин |
Тогда равно:
| Id1 | FirstName | Id2 | LastName |
|---|---|---|---|
| 1 | Иван | 3 | Сидоров |
| 1 | Иван | 4 | Плюшкин |
| 2 | Пётр | 3 | Сидоров |
| 2 | Пётр | 4 | Плюшкин |
| 3 | Сидор |
Свойства
Из определений следует:
- , где
- , где
- , где
Из свойств выше нетрудно вывести:
Деление
Деление
TODO
Большое деление
TODO
Литература
- Дейт К. Введение в системы баз данных (глава 7)
- Уидом Д., Ульман Д. Основы реляционных баз данных (главы 4 и 5)