Реляционная алгебра: соединения, деление — различия между версиями
Masmirnov (обсуждение | вклад) (Структура страницы; полное соединение) |
м (rollbackEdits.php mass rollback) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 3: | Строка 3: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | '''Соединение''' (англ. ''Join'') — общее наименование для бинарных операторов на отношениях, позволяющих некоторым образом соединить данные из | + | '''Соединение''' (англ. ''Join'') — общее наименование для бинарных операторов на отношениях, позволяющих некоторым образом соединить данные из двух отношений в одно. |
}} | }} | ||
==Полное соединение== | ==Полное соединение== | ||
Строка 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> | ||
+ | ** ''Замечание 1.'' <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex> — это и есть кортежи из <tex>R_1</tex>, которым не соответствует ни один кортеж из <tex>R_2</tex> | ||
+ | ** ''Замечание 2.'' Множество атрибутов у <tex>R_1 \Join R_2</tex> есть надмножество атрибутов у <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex>. Подразумевается, что у <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex> недостающие атрибуты дополняются значениями <tex>null</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 \ltimes R_2</tex> и <tex>R_1 \rtimes R_2</tex> в соответствующие свойства <tex>R_1 \, ⟕ \, R_2</tex> и <tex>R_1 \, ⟖ \, R_2</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> | ||
=Деление= | =Деление= | ||
− | ''' | + | ==Деление== |
+ | |||
+ | {{Определение | ||
+ | |definition= | ||
+ | Пусть даны отношения <tex>A</tex> с заголовком <tex>X \cup Y</tex> и отношение <tex>B</tex> с заголовком <tex>Y</tex>. Тогда '''делением''' (англ. ''Division'') <tex>A</tex> на <tex>B</tex> называется максимальное по включению отношение <tex>C</tex> с заголовком <tex>X</tex>, такое что <tex>B \times C \subseteq A</tex>. Обозначение: <tex>A \div B</tex> | ||
+ | }} | ||
+ | Определение деления в реляционной алгебре хорошо перекликается с определением деления с остатком в арифметике: ''«Частным от деления целого числа <tex>a</tex> на натуральное число <tex>b</tex> называется максимальное целое <tex>c</tex>, такое что <tex>bc \leq a</tex>.»'' | ||
+ | |||
+ | ===Пример=== | ||
+ | |||
+ | Рассмотрим следующие отношения, <tex>A</tex> и <tex>B</tex> соответственно: | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''Id''' | ||
+ | !'''FirstName''' | ||
+ | |- | ||
+ | |1 | ||
+ | |Иван | ||
+ | |- | ||
+ | |2 | ||
+ | |Иван | ||
+ | |- | ||
+ | |1 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |2 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |3 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |1 | ||
+ | |Сидор | ||
+ | |- | ||
+ | |3 | ||
+ | |Сидор | ||
+ | |} | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''Id''' | ||
+ | |- | ||
+ | |1 | ||
+ | |- | ||
+ | |2 | ||
+ | |} | ||
+ | Тогда результатом деления <tex>A</tex> на <tex>B</tex> будут такие имена (FirstName), которые в отношении <tex>A</tex> ассоциированы и с <tex>Id = 1</tex>, и с <tex>Id = 2</tex>. Итого получим: | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''FirstName''' | ||
+ | |- | ||
+ | |Иван | ||
+ | |- | ||
+ | |Пётр | ||
+ | |} | ||
+ | |||
+ | ===Свойства=== | ||
+ | |||
+ | * <tex>A \div B = \{x \in \pi_X(A) \, | \, \forall y \in B: \,\, (x, y) \in A\}</tex> — интерпретация определения на языке кванторов | ||
+ | * <tex>A \div B = \pi_X(A) \setminus \pi_X(\pi_X(A) \times B \setminus A)</tex> — выражение деления через простейшие операции реляционной алгебры | ||
+ | ** ''Объяснение.'' <tex>\pi_X(A) \times B \setminus A</tex> это все такие пары <tex>(x, y) \in X \times Y</tex>, что <tex>x \in \pi_X(A)</tex>, но <tex>(x, y) \notin A</tex>. | ||
+ | ** Тогда <tex>\pi_X(\pi_X(A) \times B \setminus A)</tex> — это все <tex>x \in \pi_X(A)</tex>, такие что <tex>\{x\} \times B \not\subseteq A</tex>. | ||
+ | ** Тогда <tex>\pi_X(A) \setminus \pi_X(\pi_X(A) \times B \setminus A)</tex> — это максимальное по включению <tex>C \subseteq \pi_X(A)</tex>, что <tex>C \times B \subseteq A</tex> — то есть, в точности результат деления <tex>A</tex> на <tex>B</tex> по определению | ||
+ | |||
+ | ==Большое деление== | ||
+ | |||
+ | {{Определение | ||
+ | |definition= | ||
+ | Пусть даны отношения <tex>A</tex> с заголовком <tex>X \cup Y</tex> и отношение <tex>B</tex> с заголовком <tex>Y \cup Z \,\,\,\, (X \cap Z = \varnothing)</tex>. Тогда '''большим делением''' (англ. ''Great division'') <tex>A</tex> на <tex>B</tex> называется максимальное по включению отношение с заголовком <tex>X \cup Z</tex>, такое что для каждого <tex>(x, z) \in X \times Z</tex> верно <tex>\{x\} \times \pi_Y(\sigma_{Z=z}(B)) \subseteq A</tex>. Обозначение: <tex>A ⋇ B</tex> | ||
+ | }} | ||
+ | ===Пример=== | ||
+ | |||
+ | Рассмотрим следующие отношения, <tex>A</tex> и <tex>B</tex> соответственно: | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''Id''' | ||
+ | !'''FirstName''' | ||
+ | |- | ||
+ | |1 | ||
+ | |Иван | ||
+ | |- | ||
+ | |2 | ||
+ | |Иван | ||
+ | |- | ||
+ | |1 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |2 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |3 | ||
+ | |Пётр | ||
+ | |- | ||
+ | |1 | ||
+ | |Сидор | ||
+ | |- | ||
+ | |3 | ||
+ | |Сидор | ||
+ | |} | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''Id''' | ||
+ | !'''LastName''' | ||
+ | |- | ||
+ | |1 | ||
+ | |Иванов | ||
+ | |- | ||
+ | |2 | ||
+ | |Иванов | ||
+ | |- | ||
+ | |1 | ||
+ | |Петров | ||
+ | |- | ||
+ | |3 | ||
+ | |Сидоров | ||
+ | |} | ||
+ | Тогда результатом большого деления <tex>A</tex> на <tex>B</tex> будет: | ||
+ | {| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px" | ||
+ | !'''FirstName''' | ||
+ | !'''LastName''' | ||
+ | |- | ||
+ | |Иван | ||
+ | |Иванов | ||
+ | |- | ||
+ | |Иван | ||
+ | |Петров | ||
+ | |- | ||
+ | |Пётр | ||
+ | |Иванов | ||
+ | |- | ||
+ | |Пётр | ||
+ | |Петров | ||
+ | |- | ||
+ | |Пётр | ||
+ | |Сидоров | ||
+ | |- | ||
+ | |Сидор | ||
+ | |Петров | ||
+ | |- | ||
+ | |Сидор | ||
+ | |Сидоров | ||
+ | |} | ||
+ | ''Объяснение.'' Чтобы найти результат большого деления, переберём всевозможные <tex>(x, z) \in X \times Z</tex>. В нашем случае <tex>X = \{(Иван), (Пётр), (Сидор)\}, Z = \{(Иванов), (Петров), (Сидоров)\}</tex>. | ||
+ | |||
+ | Возьмём <tex>(x, z) = (Иван, Иванов)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Иванов}(B)) = \{(1), (2)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Иванов}(B)) = \{(1, Иван), (2, Иван)\}</tex>, что является подмножеством <tex>A</tex>. Значит, <tex>(Иван, Иванов)</tex> есть в результате большого деления. | ||
+ | |||
+ | Возьмём <tex>(x, z) = (Иван, Петров)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Петров}(B)) = \{(1)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Петров}(B)) = \{(1, Иван)\}</tex>, что является подмножеством <tex>A</tex>. Значит, <tex>(Иван, Петров)</tex> есть в результате большого деления. | ||
+ | |||
+ | Возьмём <tex>(x, z) = (Иван, Сидоров)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Сидоров}(B)) = \{(3)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Сидоров}(B)) = \{(3, Иван)\}</tex>, что '''не''' является подмножеством <tex>A</tex>. Значит, элемента <tex>(Иван, Сидоров)</tex> нет в результате большого деления. | ||
+ | |||
+ | Аналогично перебираются 6 оставшихся элементов <tex>X \times Z</tex>. | ||
+ | |||
+ | ===Свойства=== | ||
+ | |||
+ | * <tex>A ⋇ B = \{(x, z) \in \pi_X(A) \times \pi_Z(B) \, | \, \forall y \in \pi_Y(\sigma_{Z=z}(B)): \,\, (x, y) \in A\}</tex> — интерпретация определения на языке кванторов | ||
+ | * Если <tex>C = A ⋇ B</tex>, то для каждого <tex>z \in Z</tex> верно <tex>\pi_X(\sigma_{Z=z}(C)) = A \div \pi_Y(\sigma_{Z=z}(B))</tex> — интерпретация большого деления как "деление для каждого <tex>z</tex>" | ||
+ | * <tex>A ⋇ B = \pi_X(A) \times \pi_Z(B) \setminus \pi_{XZ}(\pi_X(A) \times B \setminus A \Join B)</tex> — выражение большого деления через простейшие операции реляционной алгебры | ||
+ | |||
+ | =Литература= | ||
+ | * ''Дейт К.'' Введение в системы баз данных (глава 7) | ||
+ | * ''Уидом Д., Ульман Д.'' Основы реляционных баз данных (главы 4 и 5) | ||
+ | |||
+ | [[Категория: Базы данных]] |
Текущая версия на 19:41, 4 сентября 2022
Содержание
Соединения
Определение: |
Соединение (англ. 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 | Плюшкин |
Свойства
Непосредственно из определений вытекают следующие свойства:
-
- Замечание 1. — это и есть кортежи из , которым не соответствует ни один кортеж из
- Замечание 2. Множество атрибутов у есть надмножество атрибутов у . Подразумевается, что у недостающие атрибуты дополняются значениями , чтобы операция объединения была определена
Из этих свойств, в свою очередь, следует:
Полусоединения
Определение: |
Левым полусоединением (англ. 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 | Сидор |
Свойства
Из определений следует:
- , где
- , где
- , где
Из свойств выше нетрудно вывести:
Деление
Деление
Определение: |
Пусть даны отношения | с заголовком и отношение с заголовком . Тогда делением (англ. Division) на называется максимальное по включению отношение с заголовком , такое что . Обозначение:
Определение деления в реляционной алгебре хорошо перекликается с определением деления с остатком в арифметике: «Частным от деления целого числа
на натуральное число называется максимальное целое , такое что .»Пример
Рассмотрим следующие отношения,
и соответственно:Id | FirstName |
---|---|
1 | Иван |
2 | Иван |
1 | Пётр |
2 | Пётр |
3 | Пётр |
1 | Сидор |
3 | Сидор |
Id |
---|
1 |
2 |
Тогда результатом деления
на будут такие имена (FirstName), которые в отношении ассоциированы и с , и с . Итого получим:FirstName |
---|
Иван |
Пётр |
Свойства
- — интерпретация определения на языке кванторов
-
- Объяснение. это все такие пары , что , но .
- Тогда — это все , такие что .
- Тогда — это максимальное по включению , что — то есть, в точности результат деления на по определению
— выражение деления через простейшие операции реляционной алгебры
Большое деление
Определение: |
Пусть даны отношения | с заголовком и отношение с заголовком . Тогда большим делением (англ. Great division) на называется максимальное по включению отношение с заголовком , такое что для каждого верно . Обозначение:
Пример
Рассмотрим следующие отношения,
и соответственно:Id | FirstName |
---|---|
1 | Иван |
2 | Иван |
1 | Пётр |
2 | Пётр |
3 | Пётр |
1 | Сидор |
3 | Сидор |
Id | LastName |
---|---|
1 | Иванов |
2 | Иванов |
1 | Петров |
3 | Сидоров |
Тогда результатом большого деления
на будет:FirstName | LastName |
---|---|
Иван | Иванов |
Иван | Петров |
Пётр | Иванов |
Пётр | Петров |
Пётр | Сидоров |
Сидор | Петров |
Сидор | Сидоров |
Объяснение. Чтобы найти результат большого деления, переберём всевозможные
. В нашем случае .Возьмём
. Тогда . Тогда , что является подмножеством . Значит, есть в результате большого деления.Возьмём
. Тогда . Тогда , что является подмножеством . Значит, есть в результате большого деления.Возьмём
. Тогда . Тогда , что не является подмножеством . Значит, элемента нет в результате большого деления.Аналогично перебираются 6 оставшихся элементов
.Свойства
- — интерпретация определения на языке кванторов
- Если , то для каждого верно — интерпретация большого деления как "деление для каждого "
- — выражение большого деления через простейшие операции реляционной алгебры
Литература
- Дейт К. Введение в системы баз данных (глава 7)
- Уидом Д., Ульман Д. Основы реляционных баз данных (главы 4 и 5)