Реляционная алгебра: операции над данными, свойства и связь с SQL — различия между версиями
Imka239 (обсуждение | вклад) (→Соединения) |
Imka239 (обсуждение | вклад) (→Примеры) |
||
| Строка 177: | Строка 177: | ||
===Примеры=== | ===Примеры=== | ||
| − | * Пусть дана таблица `Persons (Id, Name, Birthday, MotherId, FatherId)` и требуется получить дни рождения родителей - `(Name, FatherBirthday, MotherBirthday)` | + | * Пусть дана таблица `Persons (Id, Name, Birthday, MotherId, FatherId)` и требуется получить дни рождения родителей - `(Name, FatherBirthday, MotherBirthday)`. |
'''select''' | '''select''' | ||
p.Name '''as''' Name | p.Name '''as''' Name | ||
| Строка 186: | Строка 186: | ||
'''inner join''' Persons f '''on''' p.FatherId = f.id | '''inner join''' Persons f '''on''' p.FatherId = f.id | ||
'''inner join''' Persons m '''on''' p.MotherId = m.id | '''inner join''' Persons m '''on''' p.MotherId = m.id | ||
| − | * '''Подзапросы''': например, найти людей, у которых родители родились в один день `Name` | + | * '''Подзапросы''': например, найти людей, у которых родители родились в один день `Name`. |
'''select''' p.Name '''as''' Name | '''select''' p.Name '''as''' Name | ||
'''from''' (<font color=gray>предыдущий запрос текстом</font>) | '''from''' (<font color=gray>предыдущий запрос текстом</font>) | ||
'''where''' p.MotherBirthday = p.FatherBirthday | '''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 | ||
| + | |||
==Литература== | ==Литература== | ||
* ''Дейт К. Введение в системы баз данных'' | * ''Дейт К. Введение в системы баз данных'' | ||
Версия 17:51, 19 декабря 2021
Содержание
Операции над данными
Расширение
| Определение: |
| Операция расширения позволяет добавить вычисляемый атрибут. Она принимает отношение и возвращает другое, идентичное заданному, добавляя к нему дополнительный атрибут, полученный в результате вычисления произвольных скалярных функций от значений атрибутов. |
Пример: отношение R со значением веса в фунтах
| Id | Weight |
|---|---|
| 1 | 12.0 |
| 2 | 17.0 |
Примером будет — мы добавим значение веса в граммах:
| Id | Weight | GMWT |
|---|---|---|
| 1 | 12.0 | 5448.0 |
| 2 | 17.0 | 7718.0 |
Агрегирование
| Определение: |
| Агрегирование позволяет выполнить функцию на нескольних кортежах сразу, с указанием сохраняемых и агрегируемого атрибутов. При этом кортежи группируются по значениям сохраняемых атрибутов, затем над каждой группой применяется функция агрегации. |
К типичным разновидностям относятся `SUM`, `COUNT`, `AVG`, `MAX`, `MIN`, `ALL`, `ANY`. Пример операции `SUM` над отношением
| Supplier | Price | Items |
|---|---|---|
| 1 | 1 | 4 |
| 1 | 2 | 5 |
| 2 | 3 | 6 |
Посчитаем , получаем:
| Supplier | Total |
|---|---|
| 1 | 14 |
| 2 | 18 |
Ещё один хороший пример - сумма по пустому множеству аттрибутов. Посчитаем от того же отношения и получим
| Total |
|---|
| 32 |
Свойства реляционной алгебры
Свойства операций
| Определение: |
| Идемпотентность — свойство при повторном применении операции давать тот же результат. Примеры: унарные и , бинарные , , , , (справа), (слева), (справа). |
| Определение: |
| Коммутативность — свойство переместительностию (). Пример: , , , ,. |
| Определение: |
| Ассоциативность — свойство . Пример: , , , , . |
Базис операций
- Унарные операции (projection, filter и переименование)
- Объединение и разность
- Декартово произведение
- Операции над данными (расширение и агрегирование)
Остальные привычные операции выразимы из этого базиса, например
Ограничения реляционной алгебры
- Не все операции представимы (например, транзитивное замыкание)
- Следует, что РА не эквивалентна машине Тьюринга
- Эквивалентность выражений алгоритмически неразрешима
Применимость
- Внутри БД для упрощения запроса и оптимизации плана выполнения
- Для запросов, невыразимых в SQL непосредственно (таких как деление и полусоединения)
Реляционная алгебра и SQL
Унарные операции
Проекция
select distinct from R select from R -- с повторениями
Фильтрация
select * from R where Condition
Переименование
select ..., a as b, ... from R
Операции над множествами
Объединение
select * from R1 union select * from R2 select * from R1 union all select * from R2 -- с повторениями
Пересечение
select * from R1 intersect select * from R2 select * from R1 intersect all select * from R2 -- с повторениями
Разность
select * from R1 except all select * from R2 select * from R1 except all select * from R2 -- с повторениями
Операции над данными
Расширение
select *, expr as A from R
Агрегирование
select A, func(Q) as Q from R group by A select count(*)... -- подсчёт всех select count(distinct *)... -- подсчёт различных select count(q)... -- подсчёт не null ... having Condition -- фильтрация после агрегации ... order by Attrs -- сортировка
Соединения
Полное
select * from R1 cross join R2 select * from R1, R2
Естественное
select * from R1 natural join R2 select * from R1 inner join R2 using (A) select * from R1 inner join R2 on R1.A = R2.A
Внешние
select * from R1 [full] outer join R2 on select * from R1 left [join] R2 on select * from R1 right [join] R2 on
Полусоединений нет
Структура SQL-запроса
SQL-запрос иммеет вид
select
... as ..., ... as ... -- и
from
xxx join on ... --
...
xxx join on ... --
where
... --
Примеры
- Пусть дана таблица `Persons (Id, Name, Birthday, MotherId, FatherId)` и требуется получить дни рождения родителей - `(Name, FatherBirthday, MotherBirthday)`.
select
p.Name as Name
f.Birthday as FatherBirthday
m.Birthday as MotherBirthday
from
Persons p
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 (предыдущий запрос текстом)
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
Литература
- Дейт К. Введение в системы баз данных
- Уидом Д., Ульман Д. Основы реляционных баз данных