Изменения

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

Исчисление кортежей

4876 байт добавлено, 19:34, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Переменные-кортежи ==
В исчислении кортежей переменные являются кортежами. У каждой переменной-кортежа есть тип . Тип состоит из набора атрибутов и набора значений. Для каждого атрибута указан его домен {{---}} набор атрибутов, для каждого из которых есть домен, а так же набор значенийимя и тип. Такая комбинация из имен и типов атрибутов и набора значений в данной модели называется отношением. Из этого следует, что каждая кортежная переменная пробегает некоторое отношение.
=== Синтаксис ===
Для каждой переменной берем ее значение из тела соответствующего отношения. На языке исчисления кортежей объявление переменной записываем таким образом:
<font color = red>Переменная <font color = grey>::</font> Отношение</font>
=== Примеры ===
Мжно Можно задать переменная переменную S, которая пробегает по всем студентам, и переменную G, которая пробегает по всем группам:
S <font color = grey>::</font> Students
G <font color = grey>::</font> Groups
== Условия ==
Разделяют три вида условий: простые, составные и условия с кванторами.
=== Простые условия ===
Сравнение ==== Cравнение атрибутов с константами====К простым условиям относится сравнение атрибутов с константами. Например, можно найти студентов с именем Иван:
S<font color = grey>.</font>Name <font color = grey>=</font> <font color = green>'Иван'</font>
Или выделить студентов с идентификатором меньше 5:
S<font color = grey>.</font>Id <font color = grey><</font> <font color = #056967>5</font>
Сравнение ==== Cравнение атрибутов между собой (====Также можно сравнивать атрибуты между собой, в том числе и на неравенство). Например найти студентов, имеющих идентификатор не меньше, чем идентификатор их группы:
S<font color = grey>.</font>Id <font color = blue>$\geq$</font> G<font color = grey>.</font>Id
Сравнение ==== Cравнение атрибутов с применением формул====В качестве расширения можно использовать произвольные формулы ровно так же, как были устроены расширения в [[Реляционная алгебра|реляционной алгебре]]. Можно использовать любые формулы, зависящие от значений кортежных переменных. Например, можно найти студентов, у которых имя на 3 символа длиннее фамилии:
length<font color = grey>(</font>S<font color = grey>.</font>FirstName<font color = grey>)</font> <font color = grey>=</font> length<font color = grey>(</font>S<font color = grey>.</font>LastName<font color = grey>)</font> <font color = grey>+</font> <font color = #056967>3</font>
Можно использовать любые формулы, зависящие от значений кортежных переменных.
=== Составные условия ===
Из простых условий можно строить логические формулы с помощью стандартных логических связок«и», «или» и «не»: <font color = blue>$\land$</font>, <font color = blue>$\lor$</font>, <font color = blue>$\lnot$</font>.
Например, можно задать группы, которые имеют названия M34391 или M34371:
G <font color = blue>where</font> Name <font color = gray>=</font> <font color = green>'M34371'</font> <font color = blue>∨</font> Name <font color =
gray>=</font> <font color = green>'M34391'</font>
Или студентов с именем Иван, но которые имеют фамилию не Иванов:
S <font color = blue>where</font> FirstName <font color = gray>=</font> <font color = green>'Иван'</font> <font color = blue>∧</font> LastName <font color = gray><></font> <font color = green>'Иванов'</font>
=== Условия с кванторами ===
Поверх логических формул можно навешивать кванторы:* Всеобщности всеобщности <font color = blue>$\forall$</font>;* Существования и существования <font color = blue>$\exists$</font>.
==== Синтаксис ====
В общем случае пишем сначала квантор, затем переменную, а далее в скобках условие, которое должно выполняться.
<font color = red>Квантор Переменная <font color = grey>(</font>Условие<font color = grey>)</font></font>
==== Примеры ====
Можно задать группы, в которых есть хотя бы один Иван, то есть для группы существует такой студент, которого зовут Иван и при этом он учится в данной группе:
G <font color = blue>where</font> <font color = blue>$\exists$</font>S <font color = gray>(</font>S<font color = gray>.</font>FirstName <font color = gray>=</font> <font color = green>'Иван'</font> <font color = blue>∧</font> S<font color = gray>.</font>GId <font color = gray>=</font> G<font color = gray>.</font>GId<font color = gray>)</font>
Также можно задать группы, в которых нет Иванов. Другими словами, для любого студента, если его зовут Иван, то номер его группы не совпадает с рассматриваемым:
G <font color = blue>where</font> <font color = blue>$\forall$</font>S <font color = gray>(</font>S<font color = gray>.</font>FirstName <font color = gray>=</font> <font color = green>'Иван'</font> <font color = blue>∨</font> S<font color = gray>.</font>GId <font color = gray><></font> G<font color = gray>.</font>GId<font color = gray>)</font>
Про Отметим, что про каждую переменную известно, из какого она отношения, поэтому при подстановке в квантор рассматриваются только значения переменных из соответствующих отношений. Например, когда в первом примере пишем <font color = blue>$\exists$</font>S, это означает, что существует кортеж в отношении Students, для которого выполняется дальнейшее условие.
== Примеры ==
ПеременныеСамый простой пример {{---}} можно задавать переменные, как уже было ранее показано:
S <font color = grey>::</font> Students<font color = grey>;</font> G <font color = grey>::</font> Groups<font color = grey>;</font> C <font color = grey>::</font> Courses<font color = grey>;</font> P <font color = grey>::</font> Point<font color = grey>;</font>
G4 <font color = grey>::</font> Groups <font color = blue>where</font> Name <font color = grey>=</font> <font color = green>'M34351'</font> <font color = blue>∨</font>
Name <font color = grey>=</font> <font color = green>'M34371'</font> <font color = blue>∨</font> Name <font color = grey>=</font> <font color = green>'M34391'</font>
Рассмотрим более сложный пример, в котором используются составные условия и условия с кванторами. Полностью аттестованные группыаттестованная группа {{---}} группа такая, что у каждого студента по каждому курсу есть оценка хотя бы 60 баллов. На языке исчисления кортежей полностью это выглядит ровно так же, как и звучит:
<font color = blue>select</font> G<font color = grey>.</font>GId <font color = blue>from</font> G <font color = blue>where</font> <font color = blue>$\forall$</font>S <font color = grey>(</font><font color = blue>$\forall$</font>C <font color = grey>(</font><font color = blue>$\exists$</font>P
<font color = grey>(</font>S<font color = grey>.</font>SId <font color = grey>=</font> P<font color = grey>.</font>SId <font color = blue>$\land$</font> C<font color = grey>.</font>CId <font color = grey>=</font> P<font color = grey>.</font>CId <font color = blue>$\land$</font> P<font color = grey>.</font>Points <font color = blue>≥</font> 60<font color = grey>)))</font>
Видим, что запрос получился довольно лаконичным, в то время как в [[Реляционная алгебра|реляционной алгебре]] для такого же запроса потребовалось бы целых 2 больших деления.
Несколько Второй особенностью [[Реляционное исчисление|реляционного исчисления]] является то, что можно выбирать сразу из нескольких отношений, просто перечислив их в секции from через запятую. Мотивация состоит в том, что в секции select можно указывать только атрибуты тех отношений, из которых выбираем. В данном примере хотим указать и имя студента, и название его группы, поэтому нужно выбрать и студентов, и группы, так как в противном случае будет неоткуда достать соответсвующий кусочек информации. В таком случае еще необходимо добавить условие, что номер рассматриваемой группы и номер группы студента совпадают:
<font color = blue>select</font> S<font color = grey>.</font>FirstName<font color = grey>,</font> S<font color = grey>.</font>LastName<font color = grey>,</font> G<font color = grey>.</font>Name
<font color = blue>from</font> S<font color = grey>,</font> G
<font color = blue>where</font> S<font color = grey>.</font>GId <font color = grey>=</font> G<font color = grey>.</font>GId
1632
правки

Навигация