6.2. Операции над отношениями. Процедурные и декларативные средства обработки отношений Для описания действий над реляционными БД можно использовать три вида математического аппарата: • реляционную алгебру, • реляционное исчисление с переменными - кортежами и • реляционное исчисление с переменными - доменами. Первый аппарат относится к процедурным средствам обработки отношений, потому что запросы к БД описывают в виде последовательности операций над отношениями, Другими словами, запрос на языке реляционной алгебры может быть вычислен путем вычисления элементарных алгебраических операций с учетом их старшинства и возможного наличия скобок. Языки 2-го и 3-го вида относятся к декларативным средствам, так как они описывают свойства, которым должны удовлетворять требуемые кортежи или домены, но не указывают, каким способом следует получить результаты запроса. Все три аппарата обладают одним важным свойством: они замкнуты относительно понятия отношения, то есть операндами и результатами этих языков являются отношения. Все три языка обладают большой выразительной мощностью: очень сложные запросы к базе данных могут быть выражены с помощью одного выражения реляционной алгебры или одной формулы реляционного исчисления. Эти теоретические языки по своей выразительности эквивалентны и являются эталоном для оценки реальных языков СУБД, которые обычно включают не только операции над отношениями, но и арифметические, логические и другие функции обычных языков программирования. 6.2.1.Элементы реляционной алгебры Основная идея реляционной алгебры состоит в том, что коль скоро отношения являются множествами, то средства манипулирования отношениями могут базироваться на традиционных теоретико - множественных операциях (объединение, пересечение, взятие разности отношений, Декартово произведение отношений) и ряде специальных реляционных операций (ограничение или селекция, проекция; соединение, деление отношений). Поскольку результатом любой реляционной операции является некоторое отношение, можно образовывать реляционные выражения с помощью скобок, как в обычной алгебре. Почти все перечисленные операции имеют простую интерпретацию. Рассмотрим выполнение операций на простом примере двух отношений: 1. Результатом объединения двух отношений является отношение, включающее все кортежи, входящие хотя бы в одно из исходных отношений. Отношения должны иметь один ранг. Если R и S имеют разные имена атрибутов, то у результата V не существует имен атрибутов. V=R US Например: R (факультет, группа) = { (ФЭМ, 98Э1), (ФЭМ, 98Э2) } - группы дневного обучения S (факультет, группа) = { (ВФ , 98Э1в)} - группа вечернего обучения V(факультет, группа) = { (ФЭМ , 98Э1), (ФЭМ, 98Э2) , (ВФ, 98Э1в) } - все студенты первого курса . 2. Результатом пересечения двух отношений является отношение, включающее все кортежи, входящие в оба исходных отношения. Для данного примера V = V=R^S (d a f) 3. Разность отношений - это множество кортежей, принадлежащих R, но не принадлежащих S, ранги R и S должны быть одинаковы. V=R-S Для данного примера V = abc cbd 4. Декартово произведение двух отношений производит новое отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов. Если имена атрибутов в R и S разные, то их можно перенести и в V, но если имеются совпадающие имена атрибутов, то в V им следует дать новые имена. Например, пусть R (N зач.книжки, ФИО) - список студентов, S (экзамен, дата) - список дат экзаменов, тогда V (N зач.книжки, ФИО, экзамен, дата) = R · S можно рассматривать как полный перечень сдачи каждого экзамена каждым студентом. V= R · S 5. Результатом селекции (ограничения) отношения по некоторому условию F является отношение, включающее кортежи исходного отношения, удовлетворяющие этому условию. V = S F (R) Например, пусть условие F таково: значения атрибута B должны равняться b На практике эту операцию удобно представлять себе как отбор из таблицы ряда строк, удовлетворяющих заданному критерию. 6. При выполнении проекции отношения на заданный набор Х его атрибутов получается отношение, кортежи которого состоят из значений, взятых из заданных атрибутов исходного отношения. Для описания набора Х указывают имена или номера столбцов: V=ПxR Интуитивно легко представить себе эту операцию как "вертикальную вырезку" части столбцов из таблицы (при этом дублирующие кортежи удаляются). 7. При соединении двух отношений по некоторому условию F образуется новое отношение, кортежи которого являются конкатенацией кортежей первого и второго отношений и удовлетворяют этому условию. V = R (F) S Фактически эта операция является применением селекции к декартову произведению исходных отношений, поэтому ее результат менее объемен, чем у произведения. Частными случаями операции соединения являются эквисоединение и натуральное соединение. Эквисоединение - это такое соединение, когда условие F имеет вид А=В, где А и В - атрибуты соединяемых отношений. Этот случай часто встречается на практике. Hатуральное (естественное) соединение V = R * S - это эквисоединение, в котором имена сравниваемых атрибутов совпадают. Свойства натурального соединения: • Если схема R полностью совпадает со схемой S, то натуральное соединение R*S равносильно пересечению R C S. • Если R и S не имеют общих атрибутов, то натуральное соединение равносильно декартову произведению. Натуральное соединение не включается в набор основных реляционных операций, но имеет важное практическое значение, так как применяется для восстановления сложного понятия из нескольких нормализованных отношений. 8. Результатом реляционного деления V = R / S, где R и S отношения рангов k1 и k2 (k1> k2; k2 не равно 0) является новое отношение, состоящее из кортежей длины (k1 - k2) таких, что для всех кортежей s принадлежащих S кортеж ts принадлежит R. Рассмотрим алгоритм вычисления частного. Пусть n - количество строк отношения S. А. Цикл : от i = 1 до n. Начало: • Выделить из R все кортежи с окончанием равным i - ой строке S. •Полученный результат сохранить в виде множества кортежей Qi. Конец цикла В. Результат деления равен пересечению полученных множеств Qi, i = 1,...,n. Пример. Пусть R (ФИО, Язык) - содержит информацию о том, какой программист знает какой язык (имеются полиглоты). Выделим ФИО тех программистов, которые знают одновременно два заданных в отношении S(Язык) языка. Результат получим при делении R на S. R = { (Iv, C) (Iv, For) (Iv, Pas) ( Pet, C) (Pet, Pas) (Sid,C) (Sid, For) (Gav, For) (Gav,Pas) }. S = { (C) (For) }. Q1 = { Iv, Pet, Sid} знают С, Q2 = { Iv, Sid, Gav } знают For. V = R / S = { (Iv) ( (Sid) } знают оба языка. 9. Операция переименования производит отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены. Ее следует применять в тех случаях, когда при выполнении другой операции возникает конфликт имен атрибутов. Тогда к одному из операндов сначала применяется операция переименования, а затем основная операция выполняется уже безо всяких проблем. Корректность операций реляционной алгебры Хотя реляционная алгебра основана на аппарате теории множеств, не любая пара отношений может подвергаться операциям объединения, пересечения или разности, так как в результате должно получиться отношение. Поэтому данные операции применимы только к тем отношениям, которые имеют совпадающие схемы. Например, нельзя объединить отношение СОТРУДНИКИ (ФИО, Должность, НомерОтдела) и отношение ОТДЕЛЫ (НомерОтдела, Телефон). Проблемы с именованием результата могут встретиться при выполнении операции Декартова произведения, если в операндах имеются одноименные атрибуты, например, при умножении отношений СОТРУДНИКИ и ОТДЕЛЫ результат должен содержать два атрибута с именем "НомерОтдела". В этом случае сначала следует переименовать атрибуты одного из отношений, для приведенного примера схема результата произведения будет иметь вид П(ФИО, Должность, НомерОтдела, Отдел, Телефон). Заметим, что операция произведения на практике часто не дает осмысленного результата, но может применяться для промежуточных вычислений. Из приведенного обзора операций реляционной алгебры видно, что на строгом математическом языке можно описать данные и любое манипулирование над ними (поиск, группировку, выборку и др.). Это является важным достоинством реляционных баз данных. 6.2.2. Описание запросов на языке реляционной алгебры Обычно запрос к реляционной базе данных формулируется пользователем в словесной форме. В этой формулировке следует сначала выделить все атрибуты, участвующие в операциях. Часть атрибутов является целью решения (их значения интересуют пользователя). Для другой части атрибутов могут быть заданы условия. Если выделенные атрибуты находятся в разных отношениях, то над этими отношениями нужно выполнить операцию соединения, а затем с помощью проекции можно отсечь ненужные атрибуты. Обратите внимание, что результаты операций произведения и соединения очень громоздки, поэтому рекомендуется выбирать такой порядок выполнения операций, чтобы уменьшить объем промежуточных вычислений, например, сначала можно выполнить селекцию и проекцию над исходными отношениями (не потеряв нужные атрибуты), затем соединить результаты и снова провести проекцию. Например, задана база данных с двумя отношениями: СОТРУДНИКИ (номер, имя, оклад, отдел) и ОТДЕЛЫ (отдел, начальник, телефон, численность). Определим имена сотрудников, работающих в отделах с количеством сотрудников меньше 10. Порядок операций: A. V1 = селекция отношения ОТДЕЛЫ по условию (численность <10) B. V2 = натуральное соединение отношений СОТРУДНИКИ и V1 по условию Сотрудники.отдел = V1.отдел; C. V3 = проекция V2 на атрибут "Имя". Таким образом, запрос выполняется с помощью последовательности трех реляционных операций. 6.3.3. Элементы реляционного исчисления В отличие от реляционной алгебры (процедурный подход), реляционное исчисление реализует декларативный (описательный) подход к выполнению операций над данными, поскольку оно лишь описывает свойства желаемого результата в виде логической формулы. Например, рассмотренный выше запрос на языке реляционного исчисления выглядит примерно так: выдать значения атрибута "Имя" для таких сотрудников, что существует "Отдел" с таким значением, что "Численность" < 10. Основная идея состоит в том, чтобы любую операцию над отношениями описать в виде правильной формулы. СУБД, основанные на реляционном исчислении, автоматически распознают эти формулы и выполняют требуемые преобразования над данными. Достоинством такого подхода является то, что он позволяет построить непроцедурные языки манипулирования данными. Базисными понятиями реляционного исчисления являются: • понятие переменной с определенной для нее областью допустимых значений, • понятие правильно построенной формулы, опирающейся на переменные, предикаты и кванторы. Аналитические выражения записывают в одной из следующих форм: a. { t | Y (t) } - читается так: “множество переменных t таких, что истинна формула Y “. b. { t1, t2, ... tk | Y ‘ ( t1, t2, ... tk ) }, где t - переменная - кортеж, t1,...tk - переменные на доменах, k - ранг отношения, Y - формула, построенная из атомов. В зависимости от того, что является областью определения переменной, различают исчисление кортежей и исчисление доменов. В первом случае (форма а) в качестве значений переменных используются кортежи, во втором - домены. Реляционное исчисление кортежей Атомы формул Y могут быть трех типов: 1. R(S) - означает, что S - это кортеж в отношении R. 2. s[i] @ u[j] - означает, что i -ая компонента S и j-ая компонента U связаны оператором сравнения (< > = № ). Например: s[1] < u[3] справедливо для кортежей s = (1, 6, 6, 6) и u = (2, 2, 5, 2). 3. s[i] @ const или const @ s[i], - аналогичная п.2 связь с константой. Например, s[3] = “СИДОРОВ”. Формулы составляются из атомов по следующим правилам: 1. Каждый атом - это формула. 2. Если Y 1 и Y 2 - формулы, то Y 1 Щ Y 2, Y 1 Ъ Y 2, Ш Y 1 - тоже формулы. 3. Если Y - формула, то ($ s) (Y ) - тоже формула, которая утверждает, что существует такое значение переменной S, при котором Y истинна. 4. Если Y - формула, то (" s) (Y ) - тоже формула, которая утверждает, что при подстановке любого значения переменной S в формулу Y она остается истинной. 5. Порядок старшинства операций в формулах: операторы сравнения (< > = и т.п.), $ , " , Ш ,Щ ,Ъ . Правильно построенные формулы служат для описания условий, которые накладываются пользователем на кортежные переменные. В условиях применяются только простые сравнения атрибутов отношений с константой или с другим атрибутом. При использовании кортежных переменных можно ссылаться на отдельный атрибут этой переменной, например: если S = (5, Иванов, 500, 3) - это кортеж отношения СОТРУДНИКИ (номер, имя, оклад, отдел), то S[3] = 500 - это значение третьего атрибута данного кортежа (оклад). На практике в языках, основанных на реляционном исчислении, часто вместо номера атрибута используют его имя, например, вместо S[3] пишут S.Оклад, что более наглядно. Переменные, входящие в формулы, могут быть свободными или связанными. К свободным относят все переменные, входящие в формулу, при построении которой не использовались кванторы. Множество кортежей - значений этих переменных, при которых формула истинна, образуют результирующее отношение. Если же имя переменной Х использовано сразу после квантора $ Х или " Х, то она считается связанной переменной, которая не видна за пределами формулы, описанной в кванторе. При вычислении значения такой формулы используется не одно значение связанной переменной, а вся ее область определения. Например, пусть Х и Y - две кортежные переменные, определенные на отношении СОТРУДНИКИ. Тогда, формула $ Y (Х.Оклад > Y.Оклад) для текущего значения Х истинна в том и только в том случае, если во всем отношении СОТРУДНИКИ найдется кортеж Y такой, что значение его атрибута Оклад удовлетворяет заданному условию сравнения. Чтобы описать, какие атрибуты кортежа должны входить в результирующее отношение, используют целевой список, который может состоять из следующих элементов: A. Х.А где Х - имя свободной переменной, а А - имя атрибута отношения, B. Х, то есть имена всех атрибутов отношения; C. N = X.A, где N - новое имя атрибута результирующего отношения (когда используются несколько переменных с одинаковой областью определения). В реальных языках БД вместо математических обозначений кванторов и логических связок используют, как правило, словесные обозначения: $ EXISTS NOT " FORALL AND | WHERE OR Таким образом, аналитическое выражение реляционного исчисления кортежей можно записать в виде: Целевой Список WHERE Формула. Значением выражения является отношение, тело которого определяется формулой, а набор атрибутов и их имена - целевым списком. На основе рассмотренного исчисления построен язык SQL. Реляционное исчисление доменов В этом исчислении переменные являются доменами. Например, в базе данных СОТРУДНИКИОТДЕЛЫ можно говорить о доменных переменных ИМЯ (значения - допустимые имена) или НОМЕР (значения - допустимые номера сотрудников). Основным отличием исчисления доменов от исчисления кортежей является наличие дополнительного набора предикатов, позволяющих выражать так называемые условия членства. Если R - это отношение с атрибутами a1, a2, ..., an, то условие членства имеет вид R (ai1: vi1, ai2: vi2,..., aim: vim) (m <= n), где vij - это либо константа, либо имя доменной переменной. Условие членства истинно в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения указанных атрибутов. Во всем остальном формулы и выражения этих двух видов реляционного исчисления похожи. Реляционное исчисление доменов является основой для большинства языков запросов, основанных на использовании форм, в частности, для популярного табличного языка запросов к БД Query-byExample ("запрос по образцу"). Примеры. 1. Пусть отношение R описывает сведения о студентах специальности 0719, а отношение S - сведения о студентах специальности 0608. Как на языке реляционного исчисления описать всех студентов факультета ФЭМ? - Это будет следующая формула: V = { t | R(t) Ъ S(t) } - множество кортежей t таких, что t О R или t I S. 2. Пусть задано отношение R(t) = СТУДЕНТ (Код, ФИО, Группа). Напишем формулу для выделения имен всех студентов группы 95Э1: { t | R(t) Щ t [3] = ‘95Э1’ } или в "словесной форме": t.ФИО WHERE EXISTS t ( СТУДЕНТ (t) AND t.Группа = ‘95Э1’) 3. Опишем на языке реляционного исчисления доменов запрос к БД СОТРУДНИКИ/ОТДЕЛЫ - "Выдать номера и имена сотрудников, получающих заработную плату больше минимальной". Будем считать для простоты, что имена доменных переменных совпадают с именами атрибутов отношения СОТРУДНИКИ. Если же на одном домене определены несколько переменных, мы будем добавлять в конце имени цифры. Выражение для данного запроса имеет вид: Номер, Имя WHERE EXISTS Оклад1 (СОТРУДНИКИ(Оклад1) AND СОТРУДНИКИ(Номер, Имя, Оклад) AND Оклад > Оклад1). 4. Пусть дана БД СОТРУДНИКИ (номер, имя, оклад, отдел) и ОТДЕЛЫ (отдел, начальник, телефон, численность). Определим имена сотрудников, работающих в отделах с количеством сотрудников меньше 10. Выражение исчисления кортежей: t.Имя WHERE EXISTS t (СОТРУДНИКИ(t) AND t.Отдел = x.Отдел AND EXISTS x (ОТДЕЛ(x) AND x.Численность < 10) ) Заключение : Рассмотренные математические аппараты эквивалентны по своей выразительной силе. Языки запросов реальных реляционных СУБД основаны на применении одного (или смеси) этих аппаратов. Например, язык СУБД семейства dBASE основан на аппарате реляционной алгебры. Язык SQL, широко применяемый в различных СУБД, основан на реляционном исчислении с переменными кортежами, язык Query By Example основан на исчислении с переменными - доменами.