$ \newcommand\joineq{\raise{-0.05ex}{\unicode{xa78a}}} \newcommand{\rjoin}{\mathbin{⋉\mkern-6mu\joineq}} \newcommand{\ljoin}{\mathbin{\joineq\mkern-6mu⋊}} \newcommand{\ojoin}{\mathbin{\joineq\mkern-10mu×\mkern-10mu\joineq}}$
Базы данных

Реляционное исчисление

Реляционное исчисление

  • Декларативный язык для работы с отношениями
    • Каким должен быть результат
  • Виды реляционного исчисления
    • Исчисление кортежей
    • Исчисление доменов

Структура запроса

  • Части запроса
    • Определение переменных
    • Определение атрибутов результата
  • Синтаксис
    • Определения переменных
      select СписокАтрибутов
      from Переменные
      where Условие
      

Алгебра vs. исчисление

  • Получить идентификаторы студентов, обучающихся в группе M34371
  • Реляционная алгебра
    • $π_{SId}(σ_{Name=M34371}(Students ⋈ Groups))$
  • Исчисление кортежей
    • select S.SId from S
      where ∃G (S.GId = G.GId ∧ G.Name = 'M34371')
      
  • Исчисление доменов
    • select SId from S
      where ∃GId (S{SId=SId, GId=GId} ∧
          G{GId=GId, Name = 'M34371'})
      

Переменные-кортежи

  • Тип (кортежа)
    • Имена и типы атрибутов
    • Набор значений
  • Синтаксис
    • Переменная :: Отношение
      
  • Примеры
    • S :: Students
      G :: Groups
      G4 :: Groups where
          Name = 'M34351' ∨
          Name = 'M34371' ∨
          Name = 'M34391'
      

Операции с отношениями

  • Ограничение
    • Отношения where Условие
      
  • Объединение (запятая)
    • Отношение1, Отношение2
      
  • Примеры
    • Groups where Name = 'M34371'
      
    • G4 :: Groups where Name = 'M34351',
               Groups where Name = 'M34371',
               Groups where Name = 'M34391'
      

Условия

  • Простые условия
  • Составные условия
  • Условия с кванторами

Простые условия

  • Сравнение атрибутов с константами
    • S.Name = 'Иван'
      
    • S.Id < 5
      
  • Сравнение атрибутов между собой
    • S.Id ≥ G.Id
      
  • Сравнение с применением формул
    • length(S.FirstName) = length(S.LastName) + 3
      

Составные условия

  • Логические связки
    • , , ¬
  • Примеры
    • G where Name = 'M34371' ∨ Name = 'M34391'
      
    • S where FirstName = 'Иван' ∧ LastName <> 'Иванов'
      

Условия с кванторами

  • Кванторы
    • Всеобщности
    • Существования
  • Синтаксис
    • Квантор Переменная (Условие)
      
  • Примеры
    • G where ∃S (S.FirstName = 'Иван' ∧ S.GId = G.GId)
      
    • G where ∀S (S.FirstName = 'Иван' ∨ S.GId <> G.GId)
      

Примеры

  • Переменные
    • S :: Students; G :: Groups; C :: Courses; P :: Point;
      G4 :: Groups where Name = 'M34351' ∨
          Name = 'M34371' ∨ Name = 'M34391'
      
  • Полностью аттестованные группы
    • select G.GId from G 
      where ∀S (S.GId = G.GId → ∀C (∃P (
          S.SId = P.SId ∧ C.CId = P.CId ∧ P.Points ≥ 60)))
      
  • Несколько отношений
    • select S.FirstName, S.LastName, G.Name
      from S, G
      where S.GId = G.GId
      

Связь алгебры и исчисления

Содержание

Алгебра через исчисление (1)

  • Как сделать $π_{A_1, ..., A_n}(R)$?
    • select A1, ..., An from R
      
  • Как сделать $σ_θ(R)$?
    • from R where θ
      
  • Как сделать $ε_{A=expr}(R)$?
    • select R.*, expr as A from R
      
  • Как сделать $R_1 ∪ R_2$?
    • R :: R1, R2
      
  • Как сделать $R_1 ∖ R_2$?
    • R :: R1 where ¬∃R2 (R1 = R2)
      

Алгебра через исчисление (2)

  • Как сделать $R_1 × R_2$?
    • R1.*, R2.* from R1, R2
      
  • Как сделать $R_1 ⋈ R_2$?
    • R1.*, R2.* from R1, R2 where 
                       R1.Атрибуты = R2.Атрибуты
      
  • ⇒ Выразительна мощность
    алгебры ≤ исчисления

Исчисление через алгебру

  • Предварённая нормальная форма
    • Все кванторы
    • Условие
  • Преобразование
    • Построить выражения для каждой переменной
    • Взять декартово произведение
    • Отфильтровать по условию
    • Применить кванторы

Применение кванторов

  • Квантор существования
    • Проецируем, исключая атрибуты, порожденные переменной
  • Квантор всеобщности
    • Делим на все столбцы, порожденные переменной

Пример преобразования

  • select G.GId where ∃S (∀C (∃P
        (G.GId = S.GId ∧ S.SId = P.SId ∧
          C.CId = P.CId ∧ P.Points ≥ 60)))
    
    • Группы, в которых есть хотя бы один студент, аттестованный по всем дисциплинам
  • Преобразование
    • $T_0 = σ_{P.Points ≥ 60}((G ⋈ S × C) ⋈ P)$
    • $T_1 = π_{G_*, S_*, C_*}(T_0)$
    • $T_2 = T_1 ÷ C$
    • $T_3 = π_{G_*}(T_2)$
    • $T = π_{G_*}(π_{G_*, S_*, C_*}(σ_{P.Points ≥ 60}((G ⋈ S × C) ⋈ P)) ÷ C)$

Реляционная полнота

  • Выразительная мощность исчисления = алгебры
    • Алгебра рассматривается без расширения и агрегации
  • Реляционно-полные языки
    • Языки, выразительная мощность которых ≥ выразительной мощности реляционной алгебры

Переменные-значения

  • Тип (значения)
    • Имена и типы атрибутов
    • Набор значений
  • Синтаксис
    • Переменная :: Тип
      
  • Примеры
    • SId :: Int
      
    • FirstName :: Varchar(100)
      

Условие принадлежности

  • Есть ли в отношении заданный кортеж
    • Предикат
  • Синтаксис
    • Отношение {
          Атрибут1 = Значение1,
          Атрибут2 = Значение2,
          ...
      }
      
  • Примеры
    • S{FirstName = 'Иван', LastName = 'Иванов'}
      
    • S{SId = Id}
      
    • S{SId = SId}
      

Примеры

  • Идентификаторы всех студентов
    • SId where S{SId = SId}
      
  • Идентификаторы студентов группы M34371
    • SId where S{SId = SId, GId = 'M34371'}
      
  • Идентификаторы студ. гр. M34371 и M34391
    • SId where S{SId = SId, GId = 'M34371'} ∨
                       S{SId = SId, GId = 'M34391'}
      
  • Идентификаторы студентов, не сдавших курс номер 10
    • SId where ¬∃Points (Points ≥ 60 ∧
          P {SId = SId, Points = Points, CId = 10})
      

Алгебра через исчисление (1)

  • Как сделать $π_{A_1, ..., A_n}(R)$?
    • A1, ..., An from R where R{A1=A1, ..., An = An}
      
  • Как сделать $σ_θ(R)$?
    • A1, ..., An from R where R{A1=A1, ..., An = An} ∧ θ
      
  • Как сделать $ε_{A=expr}(R_1)$?
    • expr as A from R where R{A1=A1, ..., An = An}
      
  • Как сделать $R_1 ∪ R_2$?
    • A1, ..., An where R1{Ai=Ai} ∨ R2{Ai=Ai}
      
  • Как сделать $R_1 ∖ R_2$?
    • A1, ..., An where R1{Ai=Ai} ∧ ¬R2{Ai=Ai}
      

Алгебра через исчисление (2)

  • Как сделать $R_1 × R_2$?
    • A1, ..., An, B1, ..., Bm where R1{Ai=Ai} ∧ R2{Bj=Bj}
      
  • Как сделать $R_1 ⋈ R_2$?
    • A1, ..., An, B1, ..., Bm, C1, ..., Cl where
          R1{Ai=Ai, Bj=Bj} ∧ R2{Ck=Ck, Bj=Bj}
      
  • ⇒ Исчисление доменов реляционно полно

Datalog

  • Разработан в 1978
    • Под влиянием Пролога
    • Повлиял на SQL
    • Исчисление доменов
  • Программа
    • Набор определений отношений
    • Результат – тело одного из отношений

Атомы

  • Реляционные атомы
    • Отношения рассматриваются как предикаты
    • Кортеж принадлежит отношению
      R(x1, x2, ..., xn)
      
    • Кортеж не принадлежит отношению
      ¬R(x1, x2, ..., xn)
      
    • Вместо имен – порядок аргументов
  • Арифметические атомы
    • Сравнение двух выражений

Определение отношения

  • Синтаксис
    • Список
      Отношение(x1, x2, ..., xn) :- цель .
      
    • Каждая цель – последовательность атомов
  • В отношение входят кортежи, удовлетворяющие хотя бы одной цели
  • Кортеж удовлетворяет цели – удовлетворяет всем атомам цели
  • ⇒ запросы пишутся в ДНФ

Примеры

  • Идентификаторы и фамилии всех Иванов
    • Ivans(Id, LastName) :-
          Students(Id, FirstName, LastName),
          FirstName = 'Иван'.
      
    • Ivans(Id, LastName) :-
          Students(Id, 'Иван', LastName).
      
  • Имена всех студентов и преподавателей
    • Names(Name) :- Students(_, Name, _).
      Names(Name) :- Lecturers(_, Name, _).
      

Ограничение отношений

  • Бесконечные отношения
    • Бесконечно много элементов неизвестного типа
      Less(x, y) :- x < y.
      
    • Бесконечно много элементов (не)известного типа
      NotStudent(Id, Name) :- ¬Students(Id, Name, _).
      
  • Как запретить бесконечные отношения?
    • Каждая переменная должна входить в неотрицательный реляционный атом

Алгебра на Datalog (1)

  • Как сделать $π_{A_1, ..., A_n}(R)$?
    • Q(A1, ..., An) :- R(A1, ..., An, _, ..., _).
      
  • Как сделать $σ_θ(R)$?
    • Q(A1, ..., An) :- R(A1, ..., An), θ.
      
  • Как сделать $R_1 ∪ R_2$?
    • Q(A1, ..., An) :- R1(A1, ..., An).
      Q(A1, ..., An) :- R2(A1, ..., An).
      
  • Как сделать $R_1 ∖ R_2$?
    • Q(A1, ..., An) :- R1(A1, ..., An), ¬R2(A1, ..., An).
      

Алгебра на Datalog (2)

  • Как сделать $R_1 × R_2$?
    • Q(A1, ..., An, B1, ..., Bm) :- 
          R1(A1, ..., An), R2(B1, ..., Bm).
      
  • Как сделать $R_1 ⋈ R_2$?
    • Q(A1, ..., An, B1, ..., Bm, C1, ..., Cl) :-
          R1(A1, ..., An, B1, ..., Bm), R2(B1, ..., Bm, C1, ..., Cl).
      
  • ⇒ Datalog реляционно полон

Примеры

  • Таблица
    • Person(Id, Name, FatherId, MotherId)
      
  • Получить для каждого человека имена обоих родителей: (Name, Father, Mother)
    • Parents(N, FN, MN) :- Person(_, N, FId, MId),
          Person(FId, FN, _, _), Person(MId, MN, _, _).
      
  • Получить для каждого человека
    (Name, Parent)
    • Parents(N, FN) :- Person(_, N, FId, _),
          Person(FId, FN, _, _).
      Parents(N, MN) :- Person(_, N, _, MId),
          Person(MId, MN, _, _).
      

Рекурсивные запросы

  • Таблицы
    • Parent(Id, ParentId)
      
  • Найти всех предков
    • Транзитивное замыкание
    • Ancestor(Id, PId) :- Parent(Id, PId).
      Ancestor(Id, GId) :- Parent(Id, PId), Ancestor(PId, GId).
      
  • Какой смысл?
  • Минимальная неподвижная точка
    • Минимальное по включению множество, такое, что левая и правая части совпадают

Алгоритм поиска

  • Алгоритм поиска минимальной неподвижной точки
    • Инициализируем нерекурсивными данными
    • Пока есть следствия, пополняем ими
  • Стратифицированное отрицание
    • Не должно быть циклов, содержащих отрицания

Реляционное исчисление и SQL

Содержание

Заголовок запроса

  • Определяет, какие атрибуты будут получены
  • Реляционная алгебра
    • Самая внешняя проекция
  • Реляционное исчисление
    • Заголовок запроса

Раздел from

  • Определяет набор отношений, с которыми производится работа
  • Реляционная алгебра
    • Соединения
  • Реляционное исчисление
    • Переменные отношений

Раздел where

  • Определяет набор кортежей, с которыми производится работа
  • Реляционная алгебра
    • Самая внешняя фильтрация
  • Реляционное исчисление
    • Условия на кортежи

Куда делись кванторы?

  • Большинство кванторов применяется для соединений
  • Подзапросы
    • Существования (exists)
    • Вхождения (in)
    • Условные (any, all)
    • Скалярные

Подзапросы существования

  • Аналогичные квантору существования
  • Квантор всеобщности не поддерживается
    • Но $∀ v (p(v)) ≡ ¬∃v (¬p(v))$
  • Синтаксис
    • [not] exists (select ...)
      
  • Пример
    • Группы, в которых нет студентов
      select G.Name from G where
      not exists (select * from S where S.GId = G.GId)
      

Подзапросы вхождения

  • Синтаксис
    • (выражения) [not] in (select ...)
      
  • Пример
    • Оценки по предметам четвертого курса
      select * from P where P.CId in
          (select CId from C where Year = 4)
      

Условные подзапросы

  • Синтаксис
    • выражение условие { any | all } (select ...)
      
  • Пример
    • Лучшие студенты по предметам
      select SId, CId from P as PE where PE.Points >=
          all (select Points from P where P.CId = PE.CId)
      

Скалярные подзапросы

  • Синтаксис
    • (select ...)
      
  • Пример
    • Студенты и название группы
      select
          SId,
          (select Name from G where G.GId = S.GId)
      from S
      

Коррелированные подзапросы

  • Коррелированный подзапрос
    • Есть свободные переменные
  • Некоррелированный подзапрос
    • Нет свободных переменных
  • Примеры
    • Лучшие студенты по предметам
      select SId, CId from P as PE where PE.Points >=
          all (select Points from P where P.CId = PE.CId)
      
    • Оценки по предметам четвертого курса
      select * from P where P.CId in
          (select CId from C where Year = 4)
      

Рекурсия

  • Добавлена в SQL3
  • Синтаксис
    • with recursive Отношение(колонки) as ...
      
    • Отрицание должно быть стратифицировано
  • Пример
    • with recursive Ancestor(Id, AId) as
          select Id, PId from Parent
          union
          select P.Id, A.AId from Ancestor A
              inner join Parent P on A.Id = P.PId
      select * from Ancestor;
      

Основная литература

  • Дейт К. Введение в системы баз данных (глава 8)
  • Уидом Д., Ульман Д. Основы реляционных баз данных (главы 4 и 5)
  • Gulutzan P., Pelzer T. SQL-99 complete, really

Дополнительная литература

  • Codd E. F. A relational model of data for large shared data banks
  • Codd E. F. Relational completeness of data base sublanguages