Изменения

Перейти к: навигация, поиск
м
rollbackEdits.php mass rollback
|definition=
'''Идемпотентность''' {{---}} свойство при повторном применении операции давать тот же результат. <br>
'''Примеры''': унарные <tex>\pi</tex> (вторая проекция на одно и то же множество атрибутов не влияет на результат) и <tex>\sigma</tex>(две фильтрации не влияют на результат), бинарные <tex>\bowtie</tex>(естественное соединение идемпотентно и слева, и справа), <tex>\cup</tex>, <tex>\cap</tex>(аналогично и объединение, и пересечение идемпотентно и слева, и справа), <tex>⟕, ⟖, ⟗</tex>(внешние соединения тоже идемпотентны и слева, и справа), <tex>\ltimes</tex> (только справа), <tex>\rtimes</tex> (только слева), <tex>-</tex> (только справа).
}}
{{Определение
|definition=
'''Коммутативность''' {{---}} свойство переместительностию возможность перестановки двух аргументов (<tex>x \circ y = y \circ x</tex>). <br>'''Пример''': <tex>\bowtie</tex>(ествественное соединение коммутативно), <tex>\cup</tex>, <tex>\cap</tex>(из теории множеств коммутативно), <tex>⟗</tex>,<tex>\times</tex>(декартово произведение и внешнее соединение также являются коммутативными операциями).
}}
|definition=
'''Ассоциативность''' {{---}} свойство <tex>\forall x, y, z: {{(x \circ y)} \circ z} = {x \circ {(y \circ z)}} </tex>. <br>
'''Пример''': <tex>\bowtie</tex>, <tex>\cup</tex>, <tex>\cap</tex>(из теории множеств), <tex>\times</tex>, <tex>⟕, ⟖, ⟗</tex>,(внешние соединения и декартово произведение являются ассоциативными операциями).
}}
* Эквивалентность выражений алгоритмически неразрешима
===Зачем?Применимость===* Внутри БД для оптимизации упрощения запроса и оптимизации плана выполнения* Для запросов, невыразимых в SQL непосредственно(таких как деление и полусоединения)
==Реляционная алгебра и SQL==
====Проекция <tex>\pi_{A_1,A_2,A_3,\dotsc,A_N}(R)</tex> ====
Если нужно дублировать строки с одинаковыми значениями атрибутов, то из запроса надо удалить distinct.
'''select''' '''distinct''' <tex>A_1,A_2,A_3,\dotsc,A_N</tex> '''from''' R
'''select''' <tex>A_1,A_2,A_3,\dotsc,A_N</tex> '''from''' R <font color=green>-- с повторениями </font>
====Фильтрация <tex>\sigma_{Condition}(R)</tex>====
===Операции над множествами===
====Объединение <tex>R1 \cup R2</tex>====
'''select''' * '''from''' R1 '''union''' '''select''' * '''from''' R2
'''select''' * '''from''' R1 '''union''' '''all''' '''select''' * '''from''' R2 <font color=green>-- с повторениями</font>
Если нужно объединить без повторений, то необходимо убрать из запроса '''all'''
====Пересечение <tex>R1 \cap R2</tex>==== '''select''' * '''from''' R1 '''intersect''' '''select''' * '''from''' R2=
'''select''' * '''from''' R1 '''intersect''' '''all''' '''select''' * '''from''' R2 <font color=green>-- с повторениями</font>
Если нужно объединить без повторений, то необходимо убрать из запроса '''all'''
====Разность <tex>R1 - R2</tex>====
'''select''' * '''from''' R1 '''except all''' '''select''' * '''from''' R2<font color=green>-- с повторениями</font> Чтобы убрать повторения, необходимо добавить '''select''' * ''all'from''' R1 после '''except''' '''all''' '''select''' * '''from''' R2 <font color=green>-- с повторениями</font>
===Операции над данными===
====Агрегирование <tex>Function_{Q, A}(R) </tex>====
'''select''' A, func(Q) '''as''' Q '''from''' R '''group by''' A <font color=green>-- A - сохраняемые атрибуты, func(Q) - агрегирующая функция</font> '''select count(*)...''' <font color=green>-- подсчёт всехколичества строк</font> '''select count(distinct *)...''' <font color=green>-- подсчёт различныхстрок</font> '''select count(q)...''' <font color=green>-- подсчёт не '''null'''атрибутов</font>
'''... having Condition''' <font color=green>-- фильтрация после агрегации</font>
'''... order by Attrs'''<font color=green> -- сортировка</font>
'''select * from''' R1 '''left''' ['''join'''] R2 '''on''' <tex>\theta</tex>
'''select * from''' R1 '''right''' ['''join'''] R2 '''on''' <tex>\theta</tex>
====Полусоединений нет====
===Структура SQL-запроса===
'''where'''
...<font color=green> -- <tex>\sigma</tex> </font>
где <tex>R_1, R_2, \dotsc , R_n </tex> - таблица или подзапросы
===Примеры===
* Пусть дана таблица `Persons (Id, Name, Birthday, MotherId, FatherId)` и требуется получить дни рождения родителей - `(Name, FatherBirthday, MotherBirthday)`.
'''select'''
p.Name '''as''' Name
'''inner join''' Persons f '''on''' p.FatherId = f.id
'''inner join''' Persons m '''on''' p.MotherId = m.id
* '''Подзапросы''': например, найти людей, у которых родители родились в один день `Name`.
'''select''' p.Name '''as''' Name
'''from''' (<font color=gray>предыдущий запрос текстом</font>)
'''where''' p.MotherBirthday = p.FatherBirthday
* '''Сложный запрос''': например, дана таблица `Persons (Id, Name, MotherId, FatherId)` и требуется определить для каждого человека имя его родителя - `(Name, ParentName)`.
'''select''' p.Name '''as''' Name, f.Name '''as''' ParentName
'''from''' Persons p
'''inner join''' Persons f '''on''' f.FatherId = m.Id
'''union'''
'''select''' p.Name '''as''' Name, m.Name '''as''' ParentName
'''from''' Persons p
'''inner join''' Persons m '''on''' p.MotherId = m.Id
 
==Литература==
* ''Дейт К. Введение в системы баз данных''
1632
правки

Навигация