<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.123.230.124&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.123.230.124&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.123.230.124"/>
		<updated>2026-06-11T19:29:11Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82127</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82127"/>
				<updated>2021-12-29T11:13:03Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Пример преобразования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;, $\ldots$,&amp;lt;/font&amp;gt; An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответствует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования.&lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. То есть существует такой студент, что для любого курса существует оценка не меньше 60 баллов. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения: &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений: &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C: &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Еще один квантор существования, снова проецируем: &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Можем записать как одно большое выражение в терминах реляционной алгебры: &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82126</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82126"/>
				<updated>2021-12-29T11:10:09Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Квантор существования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;, $\ldots$,&amp;lt;/font&amp;gt; An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответствует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования.&lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82125</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82125"/>
				<updated>2021-12-29T11:08:47Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Проекция \pi_{A_1,\ldots,A_n}(R) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;, $\ldots$,&amp;lt;/font&amp;gt; An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82124</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82124"/>
				<updated>2021-12-29T11:08:10Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Проекция \pi_{A_1,\ldots,A_n}(R) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;, ...,&amp;lt;/font&amp;gt; An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82123</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82123"/>
				<updated>2021-12-29T11:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Проекция \pi_{A_1,\ldots,A_n}(R) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$, ...,$&amp;lt;/font&amp;gt; An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82122</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82122"/>
				<updated>2021-12-29T11:07:36Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Алгебра через исчисление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$, ..., $&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82121</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82121"/>
				<updated>2021-12-29T11:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Проекция \pi_{A_1,\ldots,A_n}(R) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,...,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82120</id>
		<title>Исчисление кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82120"/>
				<updated>2021-12-29T11:03:46Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Синтаксис */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен один из видов [[Реляционное исчисление | реляционного исчисления]] {{---}} исчисление кортежей. &lt;br /&gt;
&lt;br /&gt;
== Переменные-кортежи ==&lt;br /&gt;
В исчислении кортежей переменные являются кортежами. У каждой переменной-кортежа есть тип. Тип состоит из набора атрибутов и набора значений. Для каждого атрибута указан его домен {{---}} имя и тип. Такая комбинация из имен и типов атрибутов и набора значений в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
Для каждой переменной берем ее значение из тела соответствующего отношения. На языке исчисления кортежей объявление переменной записываем таким образом:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Переменная &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Отношение&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры === &lt;br /&gt;
Можно задать переменную S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&lt;br /&gt;
 G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&lt;br /&gt;
Можно записать группы четвертого курса, то есть группы, которые имеют название M34351, M34371 или M34391:&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
Последний пример демонстрирует, что для отношения можно указать ограничивающее его условие.&lt;br /&gt;
&lt;br /&gt;
== Операции с отношениями ==&lt;br /&gt;
=== Ограничение ===&lt;br /&gt;
Можно ограничить отношение, выбрав те кортежи, которые удовлетворяют требуемым условиям. Это делается с помощью ключевого слова where: &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношения&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединение ===&lt;br /&gt;
Для объединения используется синтаксис перечисления объединяемых отношений через запятую:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношение1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; Отношение2&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
Рассмотрим примеры. Можно задать отношение {{---}} группы, имеющие название M34371:&lt;br /&gt;
 Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&lt;br /&gt;
Помимо способа, предложенного в предыдущей секции, можно задать группы 4 курса по-другому. Это такие группы, у которых название M34351, еще такие группы, у которых название M34371, и такие группы, у которых название M34391.&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
Разделяют три вида условий: простые, составные и условия с кванторами. &lt;br /&gt;
=== Простые условия ===&lt;br /&gt;
==== Cравнение атрибутов с константами ====&lt;br /&gt;
К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt;&lt;br /&gt;
Или выделить студентов с идентификатором меньше 5:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = grey&amp;gt;&amp;lt;&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;5&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов между собой ====&lt;br /&gt;
Также можно сравнивать атрибуты между собой, в том числе и на неравенство. Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов с применением формул ====&lt;br /&gt;
В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:&lt;br /&gt;
 length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;+&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Составные условия ===&lt;br /&gt;
Из простых условий можно строить логические формулы с помощью стандартных логических связок «и», «или» и «не»: &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lor$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lnot$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, можно задать группы, которые имеют названия M34391 или M34371:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = &lt;br /&gt;
gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или студентов с именем Иван, но которые имеют фамилию не Иванов:&lt;br /&gt;
 S &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; LastName &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иванов'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Условия с кванторами ===&lt;br /&gt;
Поверх логических формул можно навешивать кванторы всеобщности &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt; и существования &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Синтаксис ====&lt;br /&gt;
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Квантор Переменная &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;Условие&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Самый простой пример {{---}} можно задавать переменные, как уже было ранее показано:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; C &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Courses&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; P &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Point&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;≥&amp;lt;/font&amp;gt; 60&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.&lt;br /&gt;
&lt;br /&gt;
Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В данном примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82119</id>
		<title>Исчисление кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82119"/>
				<updated>2021-12-29T11:01:50Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Переменные-кортежи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен один из видов [[Реляционное исчисление | реляционного исчисления]] {{---}} исчисление кортежей. &lt;br /&gt;
&lt;br /&gt;
== Переменные-кортежи ==&lt;br /&gt;
В исчислении кортежей переменные являются кортежами. У каждой переменной-кортежа есть тип. Тип состоит из набора атрибутов и набора значений. Для каждого атрибута указан его домен {{---}} имя и тип. Такая комбинация из имен и типов атрибутов и набора значений в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
Для каждой переменной берем ее значение из тела соответствующего отношения:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Переменная &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Отношение&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры === &lt;br /&gt;
Можно задать переменную S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&lt;br /&gt;
 G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&lt;br /&gt;
Можно записать группы четвертого курса, то есть группы, которые имеют название M34351, M34371 или M34391:&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
Последний пример демонстрирует, что для отношения можно указать ограничивающее его условие.&lt;br /&gt;
&lt;br /&gt;
== Операции с отношениями ==&lt;br /&gt;
=== Ограничение ===&lt;br /&gt;
Можно ограничить отношение, выбрав те кортежи, которые удовлетворяют требуемым условиям. Это делается с помощью ключевого слова where: &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношения&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединение ===&lt;br /&gt;
Для объединения используется синтаксис перечисления объединяемых отношений через запятую:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношение1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; Отношение2&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
Рассмотрим примеры. Можно задать отношение {{---}} группы, имеющие название M34371:&lt;br /&gt;
 Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&lt;br /&gt;
Помимо способа, предложенного в предыдущей секции, можно задать группы 4 курса по-другому. Это такие группы, у которых название M34351, еще такие группы, у которых название M34371, и такие группы, у которых название M34391.&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
Разделяют три вида условий: простые, составные и условия с кванторами. &lt;br /&gt;
=== Простые условия ===&lt;br /&gt;
==== Cравнение атрибутов с константами ====&lt;br /&gt;
К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt;&lt;br /&gt;
Или выделить студентов с идентификатором меньше 5:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = grey&amp;gt;&amp;lt;&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;5&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов между собой ====&lt;br /&gt;
Также можно сравнивать атрибуты между собой, в том числе и на неравенство. Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов с применением формул ====&lt;br /&gt;
В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:&lt;br /&gt;
 length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;+&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Составные условия ===&lt;br /&gt;
Из простых условий можно строить логические формулы с помощью стандартных логических связок «и», «или» и «не»: &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lor$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lnot$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, можно задать группы, которые имеют названия M34391 или M34371:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = &lt;br /&gt;
gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или студентов с именем Иван, но которые имеют фамилию не Иванов:&lt;br /&gt;
 S &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; LastName &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иванов'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Условия с кванторами ===&lt;br /&gt;
Поверх логических формул можно навешивать кванторы всеобщности &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt; и существования &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Синтаксис ====&lt;br /&gt;
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Квантор Переменная &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;Условие&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Самый простой пример {{---}} можно задавать переменные, как уже было ранее показано:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; C &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Courses&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; P &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Point&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;≥&amp;lt;/font&amp;gt; 60&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.&lt;br /&gt;
&lt;br /&gt;
Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В данном примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82117</id>
		<title>Исчисление кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82117"/>
				<updated>2021-12-28T19:33:44Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Примеры */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен один из видов [[Реляционное исчисление | реляционного исчисления]] {{---}} исчисление кортежей. &lt;br /&gt;
&lt;br /&gt;
== Переменные-кортежи ==&lt;br /&gt;
У каждой переменной-кортежа есть тип {{---}} набор атрибутов, для каждого из которых есть домен, а так же набор значений. Такая комбинация в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
Для каждой переменной берем ее значение из тела соответствующего отношения:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Переменная &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Отношение&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры === &lt;br /&gt;
Можно задать переменную S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&lt;br /&gt;
 G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&lt;br /&gt;
Можно записать группы четвертого курса, то есть группы, которые имеют название M34351, M34371 или M34391:&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
Последний пример демонстрирует, что для отношения можно указать ограничивающее его условие.&lt;br /&gt;
&lt;br /&gt;
== Операции с отношениями ==&lt;br /&gt;
=== Ограничение ===&lt;br /&gt;
Можно ограничить отношение, выбрав те кортежи, которые удовлетворяют требуемым условиям. Это делается с помощью ключевого слова where: &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношения&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединение ===&lt;br /&gt;
Для объединения используется синтаксис перечисления объединяемых отношений через запятую:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношение1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; Отношение2&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
Рассмотрим примеры. Можно задать отношение {{---}} группы, имеющие название M34371:&lt;br /&gt;
 Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&lt;br /&gt;
Помимо способа, предложенного в предыдущей секции, можно задать группы 4 курса по-другому. Это такие группы, у которых название M34351, еще такие группы, у которых название M34371, и такие группы, у которых название M34391.&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
Разделяют три вида условий: простые, составные и условия с кванторами. &lt;br /&gt;
=== Простые условия ===&lt;br /&gt;
==== Cравнение атрибутов с константами ====&lt;br /&gt;
К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt;&lt;br /&gt;
Или выделить студентов с идентификатором меньше 5:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = grey&amp;gt;&amp;lt;&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;5&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов между собой ====&lt;br /&gt;
Также можно сравнивать атрибуты между собой, в том числе и на неравенство. Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов с применением формул ====&lt;br /&gt;
В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:&lt;br /&gt;
 length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;+&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Составные условия ===&lt;br /&gt;
Из простых условий можно строить логические формулы с помощью стандартных логических связок «и», «или» и «не»: &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lor$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lnot$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, можно задать группы, которые имеют названия M34391 или M34371:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = &lt;br /&gt;
gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или студентов с именем Иван, но которые имеют фамилию не Иванов:&lt;br /&gt;
 S &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; LastName &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иванов'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Условия с кванторами ===&lt;br /&gt;
Поверх логических формул можно навешивать кванторы всеобщности &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt; и существования &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Синтаксис ====&lt;br /&gt;
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Квантор Переменная &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;Условие&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Самый простой пример {{---}} можно задавать переменные, как уже было ранее показано:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; C &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Courses&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; P &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Point&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;≥&amp;lt;/font&amp;gt; 60&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.&lt;br /&gt;
&lt;br /&gt;
Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В данном примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82050</id>
		<title>Реляционное исчисление</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82050"/>
				<updated>2021-12-27T16:50:14Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Структура запросов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен подход к формированию запросов, основанный на описании данных, которые необходимо получить.&lt;br /&gt;
&lt;br /&gt;
== Реляционное исчисление ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционное исчисление''' {{---}} декларативный язык для работы с отношениями, описывающий какими свойствами должен обладать требуемый результат.&lt;br /&gt;
}}&lt;br /&gt;
В отличие от [[Реляционная алгебра | реляционной алгебры]] не описываем, как будет получен результат.&lt;br /&gt;
&lt;br /&gt;
Выделяют две разновидности реляционного исчисления:&lt;br /&gt;
* Исчисление кортежей {{---}} переменные принимают значения кортежа целиком;&lt;br /&gt;
* Исчисление доменов {{---}} каждая переменная принимает одно атомарное значение из какого-то домена.&lt;br /&gt;
&lt;br /&gt;
== Структура запросов ==&lt;br /&gt;
Запросы в обоих видах исчислений устроены одинаково: сначала определяем переменные, с которыми будем работать, а затем определяем атрибуты результата из наборов переменных и свойства, которым они должны удовлетворять. Для реализации описанного поведения в реляционном исчисление используется стандартная конструкция select-from-where, как и в [[Реляционная алгебра|реляционной алгебре]]. В секции select указываются интересующие атрибуты, в секции from указываются переменные, из которых берутся соответствующие атрибуты, а в секции where ограничивающие условия. С точки зрения синтаксиса запрос выглядит так:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Определения переменных&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;СписокАтрибутов&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Переменные&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Отличия от реляционной алгебры ==&lt;br /&gt;
Рассмотрим разницу между [[Реляционная алгебра | реляционной алгеброй]] и реляционным исчислением на примере: получить идентификаторы студентов, обучающихся в группе M34371.&lt;br /&gt;
&lt;br /&gt;
Запрос в реляционной алгебре состоит из естественного соединения студентов с номерами групп, затем фильтрации по номеру группы и получения идентификаторов студентов:&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{SId}(\sigma_{Name=M34371}(Students \bowtie Groups))&amp;lt;/tex&amp;gt;. По шагам описали, что необходимо сделать.&lt;br /&gt;
&lt;br /&gt;
Соответсвующий запрос в терминах исчисления кортежей (S {{---}} Students, G {{---}} Groups):&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;G &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
То есть, не указываем, как конкретно собираемся исполнять запрос, а описали, какие студенты нас интересуют.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82049</id>
		<title>Реляционное исчисление</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82049"/>
				<updated>2021-12-27T16:44:04Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Структура запросов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен подход к формированию запросов, основанный на описании данных, которые необходимо получить.&lt;br /&gt;
&lt;br /&gt;
== Реляционное исчисление ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционное исчисление''' {{---}} декларативный язык для работы с отношениями, описывающий какими свойствами должен обладать требуемый результат.&lt;br /&gt;
}}&lt;br /&gt;
В отличие от [[Реляционная алгебра | реляционной алгебры]] не описываем, как будет получен результат.&lt;br /&gt;
&lt;br /&gt;
Выделяют две разновидности реляционного исчисления:&lt;br /&gt;
* Исчисление кортежей {{---}} переменные принимают значения кортежа целиком;&lt;br /&gt;
* Исчисление доменов {{---}} каждая переменная принимает одно атомарное значение из какого-то домена.&lt;br /&gt;
&lt;br /&gt;
== Структура запросов ==&lt;br /&gt;
Запросы в обоих видах исчислений устроены одинаково: сначала определяем переменные, с которыми будем работать, а затем атрибуты результата из наборов переменных и свойств, которым они должны удовлетворять. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Определения переменных&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;СписокАтрибутов&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Переменные&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Отличия от реляционной алгебры ==&lt;br /&gt;
Рассмотрим разницу между [[Реляционная алгебра | реляционной алгеброй]] и реляционным исчислением на примере: получить идентификаторы студентов, обучающихся в группе M34371.&lt;br /&gt;
&lt;br /&gt;
Запрос в реляционной алгебре состоит из естественного соединения студентов с номерами групп, затем фильтрации по номеру группы и получения идентификаторов студентов:&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{SId}(\sigma_{Name=M34371}(Students \bowtie Groups))&amp;lt;/tex&amp;gt;. По шагам описали, что необходимо сделать.&lt;br /&gt;
&lt;br /&gt;
Соответсвующий запрос в терминах исчисления кортежей (S {{---}} Students, G {{---}} Groups):&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;G &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
То есть, не указываем, как конкретно собираемся исполнять запрос, а описали, какие студенты нас интересуют.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82007</id>
		<title>Реляционное исчисление</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82007"/>
				<updated>2021-12-27T00:44:48Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Структура запросов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен подход к формированию запросов, основанный на описании данных, которые необходимо получить.&lt;br /&gt;
&lt;br /&gt;
== Реляционное исчисление ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционное исчисление''' {{---}} декларативный язык для работы с отношениями, описывающий какими свойствами должен обладать требуемый результат.&lt;br /&gt;
}}&lt;br /&gt;
В отличие от [[Реляционная алгебра | реляционной алгебры]] не описываем, как будет получен результат.&lt;br /&gt;
&lt;br /&gt;
Выделяют две разновидности реляционного исчисления:&lt;br /&gt;
* Исчисление кортежей {{---}} переменные принимают значения кортежа целиком;&lt;br /&gt;
* Исчисление доменов {{---}} каждая переменная принимает одно атомарное значение из какого-то домена.&lt;br /&gt;
&lt;br /&gt;
== Структура запросов ==&lt;br /&gt;
&lt;br /&gt;
Запросы в обоих видах исчислений устроены одинаково: сначала определяем переменные, с которыми будем работать, а затем атрибуты результата из наборов переменных и свойств, которым они должны удовлетворять.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Определения переменных&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;СписокАтрибутов&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Переменные&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Отличия от реляционной алгебры ==&lt;br /&gt;
Рассмотрим разницу между [[Реляционная алгебра | реляционной алгеброй]] и реляционным исчислением на примере: получить идентификаторы студентов, обучающихся в группе M34371.&lt;br /&gt;
&lt;br /&gt;
Запрос в реляционной алгебре состоит из естественного соединения студентов с номерами групп, затем фильтрации по номеру группы и получения идентификаторов студентов:&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{SId}(\sigma_{Name=M34371}(Students \bowtie Groups))&amp;lt;/tex&amp;gt;. По шагам описали, что необходимо сделать.&lt;br /&gt;
&lt;br /&gt;
Соответсвующий запрос в терминах исчисления кортежей (S {{---}} Students, G {{---}} Groups):&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;G &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
То есть, не указываем, как конкретно собираемся исполнять запрос, а описали, какие студенты нас интересуют.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82006</id>
		<title>Реляционное исчисление</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=82006"/>
				<updated>2021-12-27T00:44:25Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Структура запросов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен подход к формированию запросов, основанный на описании данных, которые необходимо получить.&lt;br /&gt;
&lt;br /&gt;
== Реляционное исчисление ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционное исчисление''' {{---}} декларативный язык для работы с отношениями, описывающий какими свойствами должен обладать требуемый результат.&lt;br /&gt;
}}&lt;br /&gt;
В отличие от [[Реляционная алгебра | реляционной алгебры]] не описываем, как будет получен результат.&lt;br /&gt;
&lt;br /&gt;
Выделяют две разновидности реляционного исчисления:&lt;br /&gt;
* Исчисление кортежей {{---}} переменные принимают значения кортежа целиком;&lt;br /&gt;
* Исчисление доменов {{---}} каждая переменная принимает одно атомарное значение из какого-то домена.&lt;br /&gt;
&lt;br /&gt;
== Структура запросов ==&lt;br /&gt;
&lt;br /&gt;
Запросы в обоих видах исчислений устроены одинаково. Сначала определяем переменные, с которыми будем работать, а затем атрибуты результата из наборов переменных и свойств, которым они должны удовлетворять.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Определения переменных&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;СписокАтрибутов&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Переменные&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Отличия от реляционной алгебры ==&lt;br /&gt;
Рассмотрим разницу между [[Реляционная алгебра | реляционной алгеброй]] и реляционным исчислением на примере: получить идентификаторы студентов, обучающихся в группе M34371.&lt;br /&gt;
&lt;br /&gt;
Запрос в реляционной алгебре состоит из естественного соединения студентов с номерами групп, затем фильтрации по номеру группы и получения идентификаторов студентов:&lt;br /&gt;
&amp;lt;tex&amp;gt;\pi_{SId}(\sigma_{Name=M34371}(Students \bowtie Groups))&amp;lt;/tex&amp;gt;. По шагам описали, что необходимо сделать.&lt;br /&gt;
&lt;br /&gt;
Соответсвующий запрос в терминах исчисления кортежей (S {{---}} Students, G {{---}} Groups):&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;G &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
То есть, не указываем, как конкретно собираемся исполнять запрос, а описали, какие студенты нас интересуют.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82005</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82005"/>
				<updated>2021-12-27T00:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Пример преобразования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим пример {{---}} группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82004</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82004"/>
				<updated>2021-12-27T00:42:49Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Пример преобразования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют такие группы, что существует хотя бы один студент, учащийся в этой группе, у которого по всем курсам существует положительная оценка. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82002</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=82002"/>
				<updated>2021-12-27T00:40:56Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Пример преобразования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим группы, в которых хотя бы один студент полностью аттестован. На языке исчислений запрос будет выглядеть так:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81999</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81999"/>
				<updated>2021-12-27T00:30:42Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Преобразование формулы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальными операциями, поэтому рассмотрим применение подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81997</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81997"/>
				<updated>2021-12-27T00:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Применение кванторов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальной операцией, поэтому рассмотрим его подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81996</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81996"/>
				<updated>2021-12-27T00:28:06Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу к языку реляционной алгебры. Для этого сначала нам потребуется определить понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальной операцией, поэтому рассмотрим его подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81995</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81995"/>
				<updated>2021-12-27T00:27:17Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Далее нам потребуется понятие предваренной нормальной формы:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
=== Преобразование формулы ===&lt;br /&gt;
* Изначально формула состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальной операцией, поэтому рассмотрим его подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81994</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81994"/>
				<updated>2021-12-27T00:25:26Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Изначально она состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не является тривиальной операцией, поэтому рассмотрим его подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81993</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81993"/>
				<updated>2021-12-27T00:24:33Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Разность R1 \smallsetminus R2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие кортежи из R1, что не существует кортежа из R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Изначально она состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не тривиальная операция, поэтому рассматрим ее подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81992</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81992"/>
				<updated>2021-12-27T00:23:54Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие из R1, что не существует R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Изначально она состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
* После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Построим выражения для каждой переменной.&lt;br /&gt;
* Для каждой переменной определен диапазон, из которого она берет значения, поэтому далее можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. &lt;br /&gt;
* Теперь это декартово произведение необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. &lt;br /&gt;
* После того, как проверили глобальное условие, то есть сделали фильтр по нему, необходимо применить кванторы. &lt;br /&gt;
Применение кванторов не тривиальная операция, поэтому рассматрим ее подробнее.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81991</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81991"/>
				<updated>2021-12-27T00:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие из R1, что не существует R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Изначально она состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Для каждой переменной определен диапазон, из которого она берет значения, поэтому можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. Теперь его необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. Проверили, то есть сделали фильтр по условию, теперь необходимо применить кванторы. &lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81989</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81989"/>
				<updated>2021-12-27T00:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Исчисление через алгебру */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие из R1, что не существует R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
Проблема исчисления кортежей заключается в том, что можно записать любую сколь угодно большую формулу, но не понятно, что с ней дальше делать. То есть должен быть какой-то способ исполнять соответствующие запросы, иначе с практической точки зрения это все совершенно бессмысленно, хотя с теоретической это бы продолжало иметь смысл. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим, как можно преобразовать формулу. Изначально она состоит из каких-то атомарных вещей, которые можно вычислить, для каждой из них сравнить два значения, а далее идут логические связки и кванторы. Поэтому первым действием приводим выражение в предваренную нормальную форму. &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
После того, как выражение приведено в предваренную нормальную форму, в глобальном условии оказалось множество переменных. Для каждой переменной определен диапазон, из которого она берет значения, поэтому можно построить соответсвующее декартово произведение. Другими словами, берем все переменные и строим потенциально огромное декартово произведение. Теперь его необходимо отфильтровать по глобальному условию из предваренной нормальной формы. Для каждого кортежа из декартово произведения зафиксированы все значения, поэтому для каждого из них можно проверить, истинно оно или нет. Проверили, то есть сделали фильтр по условию, теперь необходимо применить кванторы. &lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответствует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
Рассмотрим такой запрос:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81982</id>
		<title>Связь алгебры и исчисления кортежей. Реляционная полнота исчисления кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D1%8C_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9._%D0%A0%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81982"/>
				<updated>2021-12-26T23:49:34Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрена связь между языками [[Реляционная алгебра|реляционная алгебра]] и [[Исчисление кортежей|исчисление кортежей]], которой является одной из разновидностей [[Реляционное исчисление|реляционного исчисления]].&lt;br /&gt;
== Алгебра через исчисление ==&lt;br /&gt;
Для того, чтобы показать связь между языками, сначала выразим операции реляционной алгебры через операции реляционного исчисления. Начнем с простых операций алгебры, далее перейдем к более сложным.&lt;br /&gt;
=== Проекция &amp;lt;tex&amp;gt;\pi_{A_1,\ldots,A_n}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Проекция выражается, как select необходимого набора атрибутов:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; A1&amp;lt;font color = gray&amp;gt;$,\ldots,$&amp;lt;/font&amp;gt;An &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Фильтр &amp;lt;tex&amp;gt;\sigma_\theta(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Чтобы сделать фильтрацию необходимо добавить в запрос в секцию where соответствующее условие:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;$\theta$&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Дополнительный столбец &amp;lt;tex&amp;gt;\varepsilon_{A=expr}(R)&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы добавить дополнительный столбец, необходимо обозначить соответсвующее выражение в секции select в явном виде:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; R&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; expr &amp;lt;font color = blue&amp;gt;as&amp;lt;/font&amp;gt; A &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
=== Объединение &amp;lt;tex&amp;gt;R_1 \cup R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для объединения отношений используется стандартный синтаксис перечисления их через запятую при объявлении переменной:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
Отметим, что для того, чтобы сделать объединение, отношения должны быть совместимыми, то есть должны иметь одинаковый набор атрибутов. Аналогично будет для следующей операции {{---}} разности отношений. &lt;br /&gt;
&lt;br /&gt;
=== Разность &amp;lt;tex&amp;gt;R1 \smallsetminus R2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Разность отношений R1 и R2 {{---}} это такие из R1, что не существует R2, с которым оно совпадает. Соответственно запрос в исчислении кортежей выражается так:&lt;br /&gt;
 R &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; R1 &amp;lt;font color = blue&amp;gt;where $\lnot\exists$&amp;lt;/font&amp;gt;R2 &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;R1 &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
Под записью R1 = R2 в секции условия имеется в виду равенство для всех соответствующих атрибутов.&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Для того, чтобы выразить декартово произведения, тоже используется синтаксис с запятой, но уже в секции from:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt; ===&lt;br /&gt;
Естественное соединение выражается как декартово произведение, но с дополнительным условием, что соответсвующие атрибуты равны:&lt;br /&gt;
 R1&amp;lt;font color = grey&amp;gt;.*,&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.*&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; R1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; R2 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &lt;br /&gt;
                 R1&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; R2&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;Атрибуты&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Реляционная полнота исчисления кортежей ===&lt;br /&gt;
&lt;br /&gt;
Набор перечисленных операций составляет базис операций реляционной алгебры. Показали, что все операции этого набора можно эмулировать в терминах реляционного исчисления. Из этого следует, что выразительна мощность реляционного исчисления не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Исчисление через алгебру ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Предваренная нормальная форма''' {{---}} форма, при которой в начале выражения записаны все кванторы, а затем глобальное условие. &lt;br /&gt;
}}&lt;br /&gt;
Преобразовать выражение реляционного исчисления в выражение реляционной алгебры происходит в несколько этапов.&lt;br /&gt;
=== Преобразование ===&lt;br /&gt;
* Построить выражения для каждой переменной;&lt;br /&gt;
* Взять декартово произведение;&lt;br /&gt;
* Отфильтровать по условию в предваренной нормальной форме;&lt;br /&gt;
* Применить кванторы.&lt;br /&gt;
&lt;br /&gt;
=== Применение кванторов ===&lt;br /&gt;
Рассмотрим подробнее, как применять кванторы.&lt;br /&gt;
==== Квантор существования ====&lt;br /&gt;
Квантор существования соответсвует проекции. Проецируем, исключая атрибуты, порожденные переменной. &lt;br /&gt;
* Если существует хотя бы одно значение кортежной переменной, удовлетворяющее условию, то проекция окажется не пустой. &lt;br /&gt;
* Если такого значения не окажется, то проекция окажется пустой. &lt;br /&gt;
Получаем в точности поведение квантора существования. &lt;br /&gt;
&lt;br /&gt;
==== Квантор всеобщности ====&lt;br /&gt;
Квантор всеобщности соответсвует делению. Делим на все столбцы, порожденные переменной. В каждом кортеже несколько столбцов, делим на всех оптом.&lt;br /&gt;
&lt;br /&gt;
=== Пример преобразования ===&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;where $\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;&lt;br /&gt;
       C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;60&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Выражению соответствуют группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам. Для удобства выражение уже записано в предваренной нормальной форме. Преобразуем:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0=\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)&amp;lt;/tex&amp;gt;. Для простоты равенства соответствующих атрибутов уже неявно записаны как естественные соединения.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1=\pi_{G_∗,S_∗,C_∗}(T_0)&amp;lt;/tex&amp;gt;. Самый внутренний квантор существования, поэтому проецируем на оставшиеся атрибуты соответствующих отношений.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2=T_1 \div C&amp;lt;/tex&amp;gt;. Следующий квантор всеобщности, поэтому делим на все атрибуты, принадлежащие отношению C.&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3=\pi_{G_∗}(T_2)&amp;lt;/tex&amp;gt;. Еще один квантор существования, снова проецируем. &lt;br /&gt;
* &amp;lt;tex&amp;gt;T=\pi_{G_∗}(\pi_{G_∗,S_∗,C_∗}(\sigma_{P.Points\geq60}((G \bowtie S \times C) \bowtie P)) \bowtie C)&amp;lt;/tex&amp;gt;. Можем записать как одно большое выражение в терминах реляционной алгебры.&lt;br /&gt;
&lt;br /&gt;
== Реляционная полнота ==&lt;br /&gt;
Любое выражение в терминах реляционной алгебры можно преобразовать в выражение в терминах реляционного исчисления. Также любое выражение реляционного исчисления можно преобразовать в обратную сторону к выражению реляционной алгебры. Таким образом, выразительные мощности исчисления и алгебры равны (алгебра рассматривается без агрегации). &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реляционно-полные языки''' {{---}} языки, выразительная мощность которых не меньше выразительной мощности реляционной алгебры.&lt;br /&gt;
}}&lt;br /&gt;
Получаем, что исчисление кортежей реляционно полно.&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81975</id>
		<title>Исчисление кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81975"/>
				<updated>2021-12-26T22:56:23Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Примеры */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен один из видов [[Реляционное исчисление | реляционного исчисления]] {{---}} исчисление кортежей. &lt;br /&gt;
&lt;br /&gt;
== Переменные-кортежи ==&lt;br /&gt;
У каждой переменной-кортежа есть тип {{---}} набор атрибутов, для каждого из которых есть домен, а так же набор значений. Такая комбинация в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
Для каждой переменной берем ее значение из тела соответствующего отношения:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Переменная &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Отношение&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры === &lt;br /&gt;
Мжно задать переменная S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&lt;br /&gt;
 G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&lt;br /&gt;
Можно записать группы четвертого курса, то есть группы, которые имеют название M34351, M34371 или M34391:&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
Последний пример демонстрирует, что для отношения можно указать ограничивающее его условие.&lt;br /&gt;
&lt;br /&gt;
== Операции с отношениями ==&lt;br /&gt;
=== Ограничение ===&lt;br /&gt;
Можно ограничить отношение, выбрав те кортежи, которые удовлетворяют требуемым условиям. Это делается с помощью ключевого слова where: &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношения&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединение ===&lt;br /&gt;
Для объединения используется синтаксис перечисления объединяемых отношений через запятую:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношение1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; Отношение2&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
Рассмотрим примеры. Можно задать отношение {{---}} группы, имеющие название M34371:&lt;br /&gt;
 Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&lt;br /&gt;
Помимо способа, предложенного в предыдущей секции, можно задать группы 4 курса по-другому. Это такие группы, у которых название M34351, еще такие группы, у которых название M34371, и такие группы, у которых название M34391.&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
Разделяют три вида условий: простые, составные и условия с кванторами. &lt;br /&gt;
=== Простые условия ===&lt;br /&gt;
==== Cравнение атрибутов с константами ====&lt;br /&gt;
К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt;&lt;br /&gt;
Или выделить студентов с идентификатором меньше 5:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = grey&amp;gt;&amp;lt;&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;5&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов между собой ====&lt;br /&gt;
Также можно сравнивать атрибуты между собой, в том числе и на неравенство. Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов с применением формул ====&lt;br /&gt;
В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:&lt;br /&gt;
 length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;+&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Составные условия ===&lt;br /&gt;
Из простых условий можно строить логические формулы с помощью стандартных логических связок «и», «или» и «не»: &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lor$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lnot$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, можно задать группы, которые имеют названия M34391 или M34371:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = &lt;br /&gt;
gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или студентов с именем Иван, но которые имеют фамилию не Иванов:&lt;br /&gt;
 S &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; LastName &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иванов'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Условия с кванторами ===&lt;br /&gt;
Поверх логических формул можно навешивать кванторы всеобщности &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt; и существования &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Синтаксис ====&lt;br /&gt;
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Квантор Переменная &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;Условие&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Самый простой пример {{---}} можно задавать переменные, как уже было ранее показано:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; C &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Courses&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; P &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Point&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;≥&amp;lt;/font&amp;gt; 60&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.&lt;br /&gt;
&lt;br /&gt;
Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В данном примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81974</id>
		<title>Исчисление кортежей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%B9&amp;diff=81974"/>
				<updated>2021-12-26T22:55:35Z</updated>
		
		<summary type="html">&lt;p&gt;188.123.230.124: /* Примеры */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе будет рассмотрен один из видов [[Реляционное исчисление | реляционного исчисления]] {{---}} исчисление кортежей. &lt;br /&gt;
&lt;br /&gt;
== Переменные-кортежи ==&lt;br /&gt;
У каждой переменной-кортежа есть тип {{---}} набор атрибутов, для каждого из которых есть домен, а так же набор значений. Такая комбинация в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
Для каждой переменной берем ее значение из тела соответствующего отношения:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Переменная &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Отношение&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры === &lt;br /&gt;
Мжно задать переменная S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&lt;br /&gt;
 G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&lt;br /&gt;
Можно записать группы четвертого курса, то есть группы, которые имеют название M34351, M34371 или M34391:&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
Последний пример демонстрирует, что для отношения можно указать ограничивающее его условие.&lt;br /&gt;
&lt;br /&gt;
== Операции с отношениями ==&lt;br /&gt;
=== Ограничение ===&lt;br /&gt;
Можно ограничить отношение, выбрав те кортежи, которые удовлетворяют требуемым условиям. Это делается с помощью ключевого слова where: &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношения&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;Условие&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединение ===&lt;br /&gt;
Для объединения используется синтаксис перечисления объединяемых отношений через запятую:&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Отношение1&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; Отношение2&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
Рассмотрим примеры. Можно задать отношение {{---}} группы, имеющие название M34371:&lt;br /&gt;
 Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&lt;br /&gt;
Помимо способа, предложенного в предыдущей секции, можно задать группы 4 курса по-другому. Это такие группы, у которых название M34351, еще такие группы, у которых название M34371, и такие группы, у которых название M34391.&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt;&lt;br /&gt;
         Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
Разделяют три вида условий: простые, составные и условия с кванторами. &lt;br /&gt;
=== Простые условия ===&lt;br /&gt;
==== Cравнение атрибутов с константами ====&lt;br /&gt;
К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt;&lt;br /&gt;
Или выделить студентов с идентификатором меньше 5:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = grey&amp;gt;&amp;lt;&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;5&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов между собой ====&lt;br /&gt;
Также можно сравнивать атрибуты между собой, в том числе и на неравенство. Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:&lt;br /&gt;
 S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id &amp;lt;font color = blue&amp;gt;$\geq$&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Id&lt;br /&gt;
&lt;br /&gt;
==== Cравнение атрибутов с применением формул ====&lt;br /&gt;
В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:&lt;br /&gt;
 length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; length&amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt; &amp;lt;font color = grey&amp;gt;+&amp;lt;/font&amp;gt; &amp;lt;font color = #056967&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Составные условия ===&lt;br /&gt;
Из простых условий можно строить логические формулы с помощью стандартных логических связок «и», «или» и «не»: &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lor$&amp;lt;/font&amp;gt;, &amp;lt;font color = blue&amp;gt;$\lnot$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Например, можно задать группы, которые имеют названия M34391 или M34371:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = &lt;br /&gt;
gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или студентов с именем Иван, но которые имеют фамилию не Иванов:&lt;br /&gt;
 S &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; LastName &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иванов'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Условия с кванторами ===&lt;br /&gt;
Поверх логических формул можно навешивать кванторы всеобщности &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt; и существования &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Синтаксис ====&lt;br /&gt;
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться. &lt;br /&gt;
 &amp;lt;font color = red&amp;gt;Квантор Переменная &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;Условие&amp;lt;font color = grey&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∧&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:&lt;br /&gt;
 G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;FirstName &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; S&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = gray&amp;gt;&amp;lt;&amp;gt;&amp;lt;/font&amp;gt; G&amp;lt;font color = gray&amp;gt;.&amp;lt;/font&amp;gt;GId&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем &amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Самый простой пример {{---}} можно задавать переменные, как уже было ранее показано:&lt;br /&gt;
 S &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Students&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; G &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; C &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Courses&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt; P &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Point&amp;lt;font color = grey&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 G4 &amp;lt;font color = grey&amp;gt;::&amp;lt;/font&amp;gt; Groups &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34351'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt;&lt;br /&gt;
     Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34371'&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;∨&amp;lt;/font&amp;gt; Name &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M34391'&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; G &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;S &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\forall$&amp;lt;/font&amp;gt;C &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = blue&amp;gt;$\exists$&amp;lt;/font&amp;gt;P&lt;br /&gt;
     &amp;lt;font color = grey&amp;gt;(&amp;lt;/font&amp;gt;S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;SId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; C&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;CId &amp;lt;font color = blue&amp;gt;$\land$&amp;lt;/font&amp;gt; P&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Points &amp;lt;font color = blue&amp;gt;≥&amp;lt;/font&amp;gt; 60&amp;lt;font color = grey&amp;gt;)))&amp;lt;/font&amp;gt;&lt;br /&gt;
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.&lt;br /&gt;
&lt;br /&gt;
Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В следующем примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают.&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;select&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;FirstName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;LastName&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;Name&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;from&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;,&amp;lt;/font&amp;gt; G&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;where&amp;lt;/font&amp;gt; S&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId &amp;lt;font color = grey&amp;gt;=&amp;lt;/font&amp;gt; G&amp;lt;font color = grey&amp;gt;.&amp;lt;/font&amp;gt;GId&lt;/div&gt;</summary>
		<author><name>188.123.230.124</name></author>	</entry>

	</feed>