$ \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. исчисление

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

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

Содержание

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

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

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

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

Условия

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

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

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

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

  • Логические связки
    • , , ¬
  • Примеры
    • G where Name = 'M3438' ∨ Name = 'M3439'
      
    • 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 = 'M3437' ∨
          Name = 'M3438' ∨ Name = 'M3439'
      
  • Полностью аттестованные группы
    • select G.GId from G where ∀S (∀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 expr as A from R
      

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

  • Как сделать $R_1 ∩ R_2$?
    • R :: R1 where ∃R2 (R1 = R2)
      
  • Как сделать $R_1 × R_2$?
    • R :: R1, R2
      
  • Как сделать $R_1 ⋈ R_2$?
    • R :: R1, R2 where R1.Атрибуты = R2.Атрибуты
      
  • Как сделать $R_1 \ojoin R_2$?
    • R ::
          R1, R2 where R1.Атрибуты = R2.Атрибуты,
          R1 where ¬∃R2 (R1.Атрибуты = R2.Атрибуты),
          R2 where ¬∃R1 (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}
      
  • Идентификаторы студентов группы M3438
    • SId where S {SId = SId, GId = M3438}
      
  • Идентификаторы студ. групп M3438 и M3439
    • SId where S {SId = SId, GId = M3438} ∨
                       S {SId = SId, GId = M3439}
      
  • Идентификаторы студентов не сдавших курс номер 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 }
      

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

  • Как сделать $R_1 ∩ R_2$?
    • A1, ..., An where R1{ Ai=Ai } ∧ R2{ Ai=Ai }
      
  • Как сделать $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 }
      
  • Как сделать $R_1 \ljoin R_2$?
    • A1, ..., An, B1, ..., Bm, C1, ..., Cl where
                 R1{ Ai=Ai, Bj=Bj } ∧ R2{ Ck=Ck, Bj=Bj },
      A1, ..., An, B1, ..., Bm, C1, ..., Cl where
                 R1{ Ai=Ai, Bj=Bj } ∧ ¬R2{ Bj=Bj }
      

Язык Datalog

Содержание

Datalog

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

Атомы

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

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

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

Примеры

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

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

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

Эмуляция реляционной алгебры

  • Унарные
    • Проекция, фильтрация, переименование
  • Операции над множествами
    • Пересечение, объединение, разность
  • Соединения
    • Естественное соединение
    • Декартово произведение
  • ⇒ Datalog реляционно полон

Примеры

  • Таблица
    • Person(Id, Name, MotherId, FatherId)
      
  • Получить для каждого человека имена обоих родителей: (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 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)

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

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