<?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=Zakhar.Koval&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=Zakhar.Koval&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/Zakhar.Koval"/>
		<updated>2026-07-25T07:03:47Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<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%B0%D1%8F_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0:_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%BD%D0%B0%D0%B4_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8,_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C_%D1%81_SQL&amp;diff=75794</id>
		<title>Реляционная алгебра: операции над данными, свойства и связь с SQL</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%B0%D1%8F_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0:_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%BD%D0%B0%D0%B4_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8,_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C_%D1%81_SQL&amp;diff=75794"/>
				<updated>2020-12-28T22:43:15Z</updated>
		
		<summary type="html">&lt;p&gt;Zakhar.Koval: Операции над данными, Свойства, SQL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Операции над данными==&lt;br /&gt;
&lt;br /&gt;
===Расширение===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Операция '''расширения''' принимает отношение и возвращает другое, идентичное заданному, если не считать дополнительный атрибут, значения которого получены путём вычисления некоторого выжражения. &lt;br /&gt;
}}&lt;br /&gt;
Пример: отношение R со значением веса в фунтах&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; padding:1000px&amp;quot;&lt;br /&gt;
!'''Id'''&lt;br /&gt;
!'''Weight'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|12.0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|17.0&lt;br /&gt;
|}&lt;br /&gt;
Применив &lt;br /&gt;
    EXTEND R ADD ( Weight * 454 ) AS GMWT&lt;br /&gt;
Мы добавим значение веса в граммах:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; padding:1000px&amp;quot;&lt;br /&gt;
!'''Id'''&lt;br /&gt;
!'''Weight'''&lt;br /&gt;
!'''GMWT'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|12.0&lt;br /&gt;
|5448.0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|17.0&lt;br /&gt;
|7718.0&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;
К типичным разновидностям относятся `SUM`, `COUNT`, `AVG`, `MAX`, `MIN`, `ALL`, `ANY`.&lt;br /&gt;
Пример операции `SUM` над отношением&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; padding:1000px&amp;quot;&lt;br /&gt;
!'''Supplier'''&lt;br /&gt;
!'''Price'''&lt;br /&gt;
!'''Items'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|6&lt;br /&gt;
|}&lt;br /&gt;
Посчитаем &amp;lt;tex&amp;gt;sum_{Total,{Supplier}} \circ \varepsilon_{Total}=Price*Items&amp;lt;/tex&amp;gt;, получаем:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; padding:1000px&amp;quot;&lt;br /&gt;
!'''Supplier'''&lt;br /&gt;
!'''Total'''&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|14&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|18&lt;br /&gt;
|}&lt;br /&gt;
Ещё один хороший пример - сумма по пустому множеству аттрибутов. Посчитаем &amp;lt;tex&amp;gt;sum_{Total,\emptyset} \circ {\varepsilon_{Total}=Price*Items}&amp;lt;/tex&amp;gt; от того же отношения и получим&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; padding:1000px&amp;quot;&lt;br /&gt;
!'''Total'''&lt;br /&gt;
|-&lt;br /&gt;
|32&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;
'''Идемпотентность''' {{---}} свойство при повторном применении операции давать тот же результат. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Примеры''': унарные &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;, бинарные &amp;lt;tex&amp;gt;\bowtie&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cup&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cap&amp;lt;/tex&amp;gt; и др. значки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Коммутативность''' {{---}} свойство переместительностию (&amp;lt;tex&amp;gt;x \circ y = y \circ x&amp;lt;/tex&amp;gt;). &amp;lt;br&amp;gt;&lt;br /&gt;
'''Пример''': &amp;lt;tex&amp;gt;\bowtie&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cup&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cap&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Ассоциативность''' {{---}} свойство &amp;lt;tex&amp;gt;\forall x, y, z: {{(x \circ y)} \circ z} = {x \circ {(y \circ z)}} &amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Пример''':  &amp;lt;tex&amp;gt;\bowtie&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cup&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\cap&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Базис операций===&lt;br /&gt;
* Унарные операции (projection, filter и переименование)&lt;br /&gt;
* Объединение и разность&lt;br /&gt;
* Декартово произведение&lt;br /&gt;
* Операции над данными (расширение и агрегирование)&lt;br /&gt;
Остальные привычные операции выразимы из этого базиса, например &amp;lt;tex&amp;gt;A \cap B = A \bowtie B&amp;lt;/tex&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;
* Для запросов, невыразимых в SQL непосредственно&lt;br /&gt;
&lt;br /&gt;
==Реляционная алгебра и SQL==&lt;br /&gt;
&lt;br /&gt;
===Унарные операции===&lt;br /&gt;
&lt;br /&gt;
====Проекция &amp;lt;tex&amp;gt;\pi_{A_1,A_2,A_3,\dotsc,A_N}(R)&amp;lt;/tex&amp;gt; ====&lt;br /&gt;
    '''select''' '''distinct''' &amp;lt;tex&amp;gt;A_1,A_2,A_3,\dotsc,A_N&amp;lt;/tex&amp;gt; '''from''' R&lt;br /&gt;
    '''select''' &amp;lt;tex&amp;gt;A_1,A_2,A_3,\dotsc,A_N&amp;lt;/tex&amp;gt; '''from''' R &amp;lt;font color=green&amp;gt;-- с повторениями &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Фильтрация &amp;lt;tex&amp;gt;\sigma_{Condition}(R)&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' * '''from''' R '''where''' 'Condition'&lt;br /&gt;
&lt;br /&gt;
====Переименование &amp;lt;tex&amp;gt;\rho_{a=b}(R)&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' ..., a '''as''' b, ... '''from''' R&lt;br /&gt;
&lt;br /&gt;
===Операции над множествами===&lt;br /&gt;
====Объединение &amp;lt;tex&amp;gt;R1 \cup R2&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' * '''from''' R1 '''union''' '''select''' * '''from''' R2&lt;br /&gt;
    '''select''' * '''from''' R1 '''union''' '''all''' '''select''' * '''from''' R2 &amp;lt;font color=green&amp;gt;-- с повторениями&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пересечение &amp;lt;tex&amp;gt;R1 \cap R2&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' * '''from''' R1 '''intersect''' '''select''' * '''from''' R2&lt;br /&gt;
    '''select''' * '''from''' R1 '''intersect''' '''all''' '''select''' * '''from''' R2 &amp;lt;font color=green&amp;gt;-- с повторениями&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Разность &amp;lt;tex&amp;gt;R1 - R2&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' * '''from''' R1 '''except all''' '''select''' * '''from''' R2&lt;br /&gt;
    '''select''' * '''from''' R1 '''except''' '''all''' '''select''' * '''from''' R2 &amp;lt;font color=green&amp;gt;-- с повторениями&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Операции над данными===&lt;br /&gt;
====Расширение &amp;lt;tex&amp;gt;\sigma_{A=expr}(R)&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' *, expr '''as''' A from R&lt;br /&gt;
&lt;br /&gt;
====Агрегирование &amp;lt;tex&amp;gt;Function_{Q, A}(R) &amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select''' A, func(Q) '''as''' Q '''from''' R '''group by''' A&lt;br /&gt;
    '''select count(*)...''' &amp;lt;font color=green&amp;gt;-- подсчёт всех&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''select count(distinct *)...''' &amp;lt;font color=green&amp;gt;-- подсчёт различных&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''select count(q)...''' &amp;lt;font color=green&amp;gt;-- подсчёт не '''null'''&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''... having Condition''' &amp;lt;font color=green&amp;gt;-- фильтрация после агрегации&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''... order by Attrs'''&amp;lt;font color=green&amp;gt; -- сортировка&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Соединения===&lt;br /&gt;
====Полное &amp;lt;tex&amp;gt;R_1 \times R_2 &amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select * from''' R1 '''cross join''' R2&lt;br /&gt;
    '''select * from''' R1, R2&lt;br /&gt;
====Естественное &amp;lt;tex&amp;gt;R_1 \bowtie R_2&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select * from''' R1 '''natural join''' R2&lt;br /&gt;
    '''select * from''' R1 '''inner join''' R2 '''using''' (A)&lt;br /&gt;
    '''select * from''' R1 '''inner join''' R2 '''on''' R1.A = R2.A&lt;br /&gt;
====Внешние &amp;lt;tex&amp;gt;R_1 \times R_2&amp;lt;/tex&amp;gt;====&lt;br /&gt;
    '''select * from''' R1 ['''full'''] '''outer join''' R2 '''on''' &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''select * from''' R1 '''left''' ['''join'''] R2 '''on''' &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''select * from''' R1 '''right''' ['''join'''] R2 '''on''' &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Структура SQL-запроса===&lt;br /&gt;
SQL-запрос иммеет вид &amp;lt;tex&amp;gt;\rho(\pi(\sigma(R_1 \oplus R_2 \oplus \dotsc \oplus R_N)))&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''select'''&lt;br /&gt;
        ... '''as''' ..., ... '''as''' ... &amp;lt;font color=green&amp;gt;-- &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''from'''&lt;br /&gt;
        &amp;lt;tex&amp;gt;R_1&amp;lt;/tex&amp;gt; &lt;br /&gt;
        '''xxx join''' &amp;lt;tex&amp;gt;R_2&amp;lt;/tex&amp;gt; '''on''' ... &amp;lt;font color=green&amp;gt;-- &amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
        '''xxx join''' &amp;lt;tex&amp;gt;R_N&amp;lt;/tex&amp;gt; '''on''' ... &amp;lt;font color=green&amp;gt;-- &amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''where'''&lt;br /&gt;
        ...&amp;lt;font color=green&amp;gt; -- &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры===&lt;br /&gt;
* Пусть дана таблица `Persons (Id, Name, Birthday, MotherId, FatherId)` и требуется получить дни рождения родителей - `(Name, FatherBirthday, MotherBirthday)`&lt;br /&gt;
    '''select'''&lt;br /&gt;
        p.Name '''as''' Name&lt;br /&gt;
        f.Birthday '''as''' FatherBirthday&lt;br /&gt;
        m.Birthday '''as''' MotherBirthday&lt;br /&gt;
      '''from'''&lt;br /&gt;
        Persons p&lt;br /&gt;
        '''inner join''' Persons f '''on''' p.FatherId = f.id&lt;br /&gt;
        '''inner join''' Persons m '''on''' p.MotherId = m.id&lt;br /&gt;
* '''Подзапросы''': например, найти людей, у которых родители родились в один день `Name`&lt;br /&gt;
    '''select''' p.Name '''as''' Name&lt;br /&gt;
        '''from''' (&amp;lt;font color=gray&amp;gt;предыдущий запрос текстом&amp;lt;/font&amp;gt;)&lt;br /&gt;
        '''where''' p.MotherBirthday = p.FatherBirthday&lt;br /&gt;
==Литература==&lt;br /&gt;
* ''Дейт К. Введение в системы баз данных''&lt;br /&gt;
* ''Уидом Д., Ульман Д. Основы реляционных баз данных''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Непроверяемые конспекты]]&lt;br /&gt;
[[Категория: Базы данных]]&lt;br /&gt;
[[Категория: Реляционная алгебра: деление и операции над данными]]&lt;/div&gt;</summary>
		<author><name>Zakhar.Koval</name></author>	</entry>

	</feed>